JS Для L oop В то время как L oop Возврат странных результатов - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь разбить строку и объединить ее по индексу. Тривиальный пример:

Вход: «ABCABCAB C» Выход: «AAABBB CCC»

Итак, я создал функцию, которая преобразует строку в массив, выскакивающий из элементов в соответствующий массив и, надеюсь, объедините его обратно в строку.

Вот функция:

function splitter(string, numSplit) {
  let splitHolder = [];
  let splitArr = string.split("");
  while (splitArr.length > 0) {
    for (let i = 0; i < numSplit; i++) {
      splitHolder[i] = splitHolder[i] === undefined
          ? [splitArr.shift()]
          : splitHolder[i].push(splitArr.shift());
      console.log(splitHolder);
    }
  }
}

Результаты для console.log показывают:

[ [ 'A' ] ]
[ [ 'A' ], [ 'B' ] ]
[ [ 'A' ], [ 'B' ], [ 'C' ] ]

который указывает, что функция работает нормально, по крайней мере, на первом l oop. Однако на втором проходе для l oop после того, как он проверяется временем. Я получаю этот журнал:

[ 2, [ 'B' ], [ 'C' ] ]
[ 2, 2, [ 'C' ] ]
[ 2, 2, 2 ]

Что очень странно, поскольку я все еще пытаюсь получить sh, что осталось от массива? Откуда взялось число c 2?

Первоначально думали, что это проблема с областью видимости, но это не так, поскольку let ограничена для всей функции.

Также попробовал уменьшить массив функция, но я все еще получаю то же число c 2.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы можете взять Array#concat вместо Array#push.

concat возвращает новый массив и push новую длину массива .

function splitter(string, numSplit) {
    let splitHolder = [];
    let splitArr = string.split("");
    while (splitArr.length) {
        for (let i = 0; i < numSplit; i++) {
            splitHolder[i] = splitHolder[i] === undefined
                ? [splitArr.shift()]
                : splitHolder[i].concat(splitArr.shift());
        }
    }
    return splitHolder;
}


console.log(splitter('ABCABCABC', 3));
0 голосов
/ 14 июля 2020

Array.pu sh () возвращает новую длину массива после pu sh

 let arr =['A', 'B']

, когда вы вставляете sh в этот массив.

arr.push('C') // return 3 . i.e. length of the array.

Я думаю, вы не хотите превращать sh в splitHolder, а объединять первый элемент splitArr.

function splitter(string, numSplit) {
  let splitHolder = [];
  let splitArr = string.split("");

  while (!!splitArr.length) {
    for (let i = 0; i < numSplit; i++) {
      splitHolder[i] = (splitHolder[i] === undefined)
          ? [splitArr.shift()]
          : splitHolder[i].concat(splitArr.shift());
      console.log(splitHolder);
    }
  }
 return splitHolder;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...