【问题标题】:Javascript: Does the while loop (global) variable get discarded / reset when the loop finishes?Javascript:当循环完成时,while 循环(全局)变量是否会被丢弃/重置?
【发布时间】:2015-07-17 18:41:39
【问题描述】:

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

【问题讨论】:

  • 那么index 是什么?我刚刚运行了这个,设置了size = 10index = 0,它并没有导致无限循环。
  • 您发布的代码没有理由导致无限循环。所以无论发生什么,都在您的stuff happens here 中发生。标题中问题的简短答案是no
  • 如果未定义大小,则会导致无限循环。检查是否定义了大小。
  • 代码编辑以反映整个程序。我试图简化代码以便于阅读。

标签: javascript loops variables while-loop


【解决方案1】:

它不会自行重置,但它只会进入内部循环一次(您在其中递增i),因此外部循环会永远重复(i 在内循环中变为2,并且永远不会之后递增)。

您可能希望在每个内部循环之后重置 j,例如:

while (i < arr.length) {
    while (j < size && i < arr.length) {
        // ...
    }
    j = 0;
    index++;
}

但是,您还应该检查index 是否在twoDArr 的范围内,因为一旦您到达index = 2,您将在此行收到错误:

twoDArr[index].push();

【讨论】:

    【解决方案2】:

    您的问题是您在通过外部循环的第二次迭代中跳过了内部循环,因此i 没有更新,i &lt; arr.length 始终为真。这是因为您从未重置j,所以j &lt; size 为假。要真正实现您想要的,您需要重置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)));

    【讨论】:

      【解决方案3】:
      while(j < size && i < arr.length){
              twoDArr[index].push(arr[i]);
              j ++;
              i ++;
      }
      

      您将2 作为size 传递给您的函数,因此当j &lt; size &amp;&amp; i &lt; arr.length 返回false 时,内部循环将执行index++

      在您第二次执行时,j 将变为 2,因此 j &lt; 2 将变为 false

      完成外部while 循环的条件是i &gt; arr.length,但i++ 被困在一个永远不会满足的条件中。

      【讨论】:

        猜你喜欢
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 2016-03-15
        • 1970-01-01
        • 2017-04-29
        • 1970-01-01
        相关资源
        最近更新 更多