Javascript:当循环结束时,while循环(全局)变量会被丢弃/重置吗
Javascript: Does the while loop (global) variable get discarded / reset when the loop finishes?
在下面的代码中,我得到了一个无限循环,因为当内部循环结束时,"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'] ]
它本身没有重置,但它只进入内循环一次(在递增i
时(,因此外循环永远重复(i
在内循环中变为2
,此后再也不会递增(。
您可能希望在每个内部循环后重置j
,例如:
while (i < arr.length) {
while (j < size && i < arr.length) {
// ...
}
j = 0;
index++;
}
然而,您还应该检查index
是否在twoDArr
的范围内,因为一旦您到达index = 2
,您将在以下行得到错误:
twoDArr[index].push();
您的问题是在第二次迭代中通过外循环跳过内循环,因此i
不会更新,而i < arr.length
始终为true。这是因为您从未重置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)));
当然,使用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)));
while(j < size && i < arr.length){
twoDArr[index].push(arr[i]);
j ++;
i ++;
}
将2
作为size
传递给函数,因此当j < size && i < arr.length
返回false
时,内部循环将执行index++
。
在第二次执行时,j
将是2
,因此j < 2
将是false
。
完成外部while
循环的条件是i > arr.length
,但i++
被困在一个永远不会满足的条件中。
相关文章:
- 如何在Javascript函数调用中循环变量
- Jquery将循环变量绑定到getJSON函数
- 如何使用jQuery循环变量名
- FileReader加载端中循环变量的值
- 为什么 CoffeScript 不“重用”循环变量
- 循环变量的Javascript不起作用
- 循环变量作为异步函数调用中的参数
- 将循环变量调用到自动压缩选择中
- Javascript 循环变量
- 如何使用以 js 为单位递增的字符串创建 for 循环变量
- JQuery:如何在 jquery 选择器中使用 for 循环变量
- 余烬每循环加倍.使用内部每个循环变量的值绑定到外部每个循环的变量中命名相同的属性
- 处理循环变量的重复声明警告
- 如何将递增的 for 循环变量传递给 node.js 中的函数
- 如何处理来自函数和与垃圾回收器有关的函数的循环变量
- 如何将循环变量传递给元素
- js canvas drawImage 不适用于循环变量
- 在 Jquery 中添加循环变量并存储在输入字段中
- 使用 for 循环变量更改 html 类的名称
- 通过循环变量引用Javascript数组元素