首页 > 解决方案 > JS For循环在while循环中返回奇怪的结果

问题描述

我正在尝试拆分一个字符串并根据它的索引组合它。一个简单的例子是:

输入:“ABCABCABC” 输出:“AAABBBCCC”

因此,我创建了一个将字符串转换为数组的函数,将元素弹出到相应的数组中,并希望将其组合回字符串。

这是功能:

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' ] ]

这表明该函数至少在第一个循环中运行良好。但是,在 for 循环的第二遍中,在 while 检查之后。我得到这个日志:

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

这很奇怪,因为我仍在尝试推动阵列的剩​​余部分?数字 2 是从哪里来的?

最初认为这是一个范围问题,但并不是因为 let 是针对整个函数的范围。

还尝试了数组减少功能,但仍然得到相同的数字 2。

标签: javascript

解决方案


你可以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));


推荐阅读