提问者:小点点

返回奇怪结果的While循环内的JS For循环


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

输入:“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。


共2个答案

匿名用户

您可以使用array#concat而不是array#push

concat返回一个新数组,并数组的新长度。

null

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));

匿名用户

array.push()返回推入后数组的新长度

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

当你将推进到这个数组。

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

我认为您不想推入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;
}