Javascript:当循环结束时,while循环(全局)变量是否被丢弃/重置?

时间:2015-07-17 18:41:40

标签: javascript loops variables while-loop

在下面的代码中,我得到一个无限循环,因为当内循环结束时,似乎“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'] ]

3 个答案:

答案 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进入最终数组。类似的东西:

&#13;
&#13;
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;
&#13;
&#13;

当然,您可以使用reduce

使整个过程更加简洁

&#13;
&#13;
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;
&#13;
&#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++被困在一个永远不会实现的条件中。