【问题标题】:Pop off array within Javascript for loop not getting all array items在Javascript for循环中弹出数组未获取所有数组项
【发布时间】:2016-01-18 09:47:14
【问题描述】:

我试图弄清楚为什么下面的代码只从数组中弹出最后 3 项而不是最后两项。

var test = ['test1','test2','test3','test4','test5'];

console.log('length - '+test.length);

for(var k = 0; k <= test.length; k++) {
    var tests = test.pop();
    console.log(tests+' - '+k);
}

以上代码的结果:

length - 5
(index):30 test5 - 0
(index):30 test4 - 1
(index):30 test3 - 2

【问题讨论】:

    标签: javascript for-loop stack


    【解决方案1】:

    Array.prototype.pop方法修改了原来的数组,所以for-loop当然只会访问一半的值,直到数组完全清空。

    你可以做的是改用while循环:

    var test = ['test1', 'test2', 'test3', 'test4', 'test5'];
    
    console.log('length - ' + test.length);
    
    while (test.length) {
      var tests = test.pop();
      console.log(tests);
    }

    【讨论】:

      【解决方案2】:

      问题是循环执行时数组的长度会发生变化,因此测试
      k &lt;= test.length会随着每次执行而变化。

      var test = ['test1','test2','test3','test4','test5'];
      
      console.log('length - '+test.length);
      
      for ( var k = 0, len = test.length; k < len; k++ ) {
        var tests = test.pop();
        console.log(tests+' - '+k);
      }

      或使用while 循环:

      var test = ['test1','test2','test3','test4','test5'];
      
      console.log('length - '+test.length);
      
      var k = 0;
      while (test.length) {
          var tests = test.pop();
          console.log(tests+' - '+(k++));
      }

      【讨论】:

        【解决方案3】:

        您每次都在增加k。打印 2, k == 3 后,列表中还剩下 2 个元素。但由于k &gt; test.length,循环结束。

        如果你真的还想继续计数,增加k但不要测试它:

        var test = ['test1', 'test2', 'test3', 'test4', 'test5'];
        
        console.log('length - ' + test.length);
        
        for (var k = 0; test.length > 0; k++) {
          var tests = test.pop();
          console.log(tests + ' - ' + k);
        }

        【讨论】:

          【解决方案4】:

          考虑一下你正在做的事情的逻辑......你的蜡烛两端都在燃烧(可以这么说)。

          k = 0, 长度 = 5 ('test1') 此时 test5 被丢弃(这就是 pop 所做的,it drops the last element

          k = 1,length = 4('test2')(此时test4被丢弃)

          依此类推...经过 3 次迭代后,您的数组是 3 个项目。

          我*认为您尝试使用 splice 完成的工作

          while(myArray.length > 0){
             console.log(myArray[0])
             myArray.splice(0,1)
          
          }
          

          【讨论】:

            【解决方案5】:

            如果您想保持您的代码风格,只需添加以下行。这是为了防止在 for 循环中重新调整数组长度:

            var arrSize = test.length;
            

            您的最终代码如下所示:

            <script>
                var test = ['test1', 'test2', 'test3', 'test4', 'test5'];
            
                var arrSize = test.length;
            
                console.log('length - ' + arrSize);
            
                for (var k = 0; k < arrSize; k++) {
                    var tests = test.pop();
                    console.log(tests + ' - ' + k);
                }
            </script>
            

            【讨论】:

              猜你喜欢
              • 2014-04-11
              • 1970-01-01
              • 1970-01-01
              • 2011-09-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-20
              相关资源
              最近更新 更多