在下面的代码中,我得到一个无限循环,因为当内循环结束时,似乎“i”一直被重置为0。这导致外循环永不停止。
循环后变量是否重置?我找不到相关文档。
function chunk(arr, size) {
var twoDArr = [[],[]];
var i = 0;
var j = 0;
var index = 0;
while(i < arr.length){
while(j < size && i < arr.length){
twoDArr[index].push(arr[i]);
j ++;
i ++;
}
index ++;
}
return twoDArr;
}
chunk(['a', 'b', 'c', 'd', 'f'], 2);
//--> [ [ 'a', 'b' ], [ 'c', 'd' ],['f'] ]
答案 0 :(得分:1)
它没有重置自身,但它只进入内部循环一次(增加i
),因此外部循环永远重复(i
变为{{ 1}}在内部循环中,之后永远不会递增。)
您可能希望在每个内循环后重置2
,例如:
j
但是,您还应检查while (i < arr.length) {
while (j < size && i < arr.length) {
// ...
}
j = 0;
index++;
}
是否在index
的范围内,因为一旦您到达twoDArr
,您就会在此行中收到错误:
index = 2
答案 1 :(得分:0)
你的问题是你在第二次迭代中通过外循环跳过内循环,所以i
没有更新,i < arr.length
总是正确的。这是因为您永远不会重置j
,因此j < size
为false。要实际实现您想要的功能,您需要重置j
并在内部循环中构建一个数组,您可以push
进入最终数组。类似的东西:
function chunk(arr, size) {
var twoDArr = [];
var i = 0;
while (i < arr.length) {
var nestedArr = [];
var j = 0;
while (j < size && i < arr.length) {
nestedArr.push(arr[i]);
j++;
i++;
}
twoDArr.push(nestedArr);
}
return twoDArr;
}
alert(JSON.stringify(chunk(['a', 'b', 'c', 'd', 'f'], 2)));
&#13;
当然,您可以使用reduce
:
function chunk(arr, size) {
return arr.reduce(function(p, c, idx) {
if (idx % size) {
p[p.length - 1].push(c);
} else {
p.push([c]);
}
return p;
}, []);
}
alert(JSON.stringify(chunk(['a', 'b', 'c', 'd', 'f'], 2)));
&#13;
答案 2 :(得分:0)
while(j < size && i < arr.length){
twoDArr[index].push(arr[i]);
j ++;
i ++;
}
您将2
作为size
传递给您的函数,因此当index++
返回j < size && i < arr.length
时,内部循环将执行false
。
在您第二次执行时,j
将为2
,因此j < 2
将为false
。
完成外部while
循环的条件是i > arr.length
,但i++
被困在一个永远不会实现的条件中。