【问题标题】:Javascript: confused about how nested for loops workJavascript:对嵌套 for 循环的工作方式感到困惑
【发布时间】:2011-09-08 10:10:37
【问题描述】:

为什么嵌套的for loops 的工作方式与以下示例中的一样:

var times = [
            ["04/11/10", "86kg"], 
            ["05/12/11", "90kg"],
            ["06/12/11", "89kg"]
];

for (var i = 0; i < times.length; i++) {
        var newTimes = [];
        for(var x = 0; x < times[i].length; x++) {
            newTimes.push(times[i][x]);
            console.log(newTimes);  


        }

    }

在这个例子中,我认为 console.log 会给我以下输出:

["04/11/10"]
["86kg"]
["05/12/11"]
["90kg"]
["06/12/11"]
["89kg"]

但是,我实际上得到了这个:

["04/11/10"]
["04/11/10", "86kg"]
["05/12/11"]
["05/12/11", "90kg"]
["06/12/11"]
["06/12/11", "89kg"]

有人能帮我理解这个吗?

编辑:

感谢您的所有回复!

【问题讨论】:

    标签: javascript arrays for-loop


    【解决方案1】:
    // remember that the increment of the counter variable
    // is always executed after each run of a loop
    
    
    for (var i = 0; i < n; i++) {
        // some statement(s) to do something.. 
    
            // initializes child-loop counter in the first run of the parent-loop
            // resets child-loop counter in all following runs of the parent-loop
            // while i is greater than 0 and lower than n
    
        for (var j = 0; j < p; j++) {
            // some statement(s) to do something..
    
                // initializes grandchild-loop counter in the first run of the child-loop
                // resets grandchild-loop counter in all following runs of the child-loop
                // while j is greater than 0 and lower than p
    
            for (var k = 0; k < q; k++) {
                // some statement(s) to do something..
                // or add more internal loop-nestings if you like..
            }
        }
    }
    
    // if the counter variables of the descendent-loops were set before the loop-nesting,
    // the inner loops would only run once, because the counter would keep the value
    // of the abortion condition after the loop is finished
    

    【讨论】:

      【解决方案2】:

      问题在于内部循环的第二轮,它将第二个元素推入 newTimes。无论如何我不明白内循环的原因。你可以写得更简单:

      var times = [
                  ["04/11/10", "86kg"], 
                  ["05/12/11", "90kg"],
                  ["06/12/11", "89kg"]
      ];
      
      for (var i = 0; i < times.length; i++) {
          console.log(time[i][0]);  
          console.log(time[i][1]);   
      }
      

      【讨论】:

        【解决方案3】:

        如果日志语句会读取,您的输出将是合适的

        console.log(times[i][x]);
        

        相反,您输出完整的新列表 newTimes,该列表在内部循环外部初始化并随着每次内部循环迭代而增长。

        【讨论】:

          【解决方案4】:

          这样做:

          var newTimes = [];
          for (var i = 0; i < times.length; i++) {
                  for(var x = 0; x < times[i].length; x++) {
                      newTimes.push(times[i][x]);
                      console.log(newTimes);  
          
          
                  }
          
              }
          

          每次循环都在重新初始化 newTimes。

          【讨论】:

            【解决方案5】:

            您在每个循环上重新定义newTimes,并且在每次列推送时输出到控制台。

            var times = [
                        ["04/11/10", "86kg"], 
                        ["05/12/11", "90kg"],
                        ["06/12/11", "89kg"]
            ];
             var newTimes = [];
            for (var i = 0; i < times.length; i++) {     
                    for(var x = 0; x < times[i].length; x++) {
                        newTimes.push(times[i][x]);
                    }
                }
                console.log(newTimes);  
            

            返回:["04/11/10", "86kg", "05/12/11", "90kg", "06/12/11", "89kg"] http://jsfiddle.net/niklasvh/SuEdt/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-13
              • 2017-05-03
              • 2012-08-24
              • 2019-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多