【问题标题】:Javascript "for..of" not working as expected.Javascript“for..of”没有按预期工作。
【发布时间】:2016-11-18 22:22:08
【问题描述】:

我似乎误解了“for..of”循环的功能。在下面的示例中,我找到了数组中最大的子数组(在本例中为 [2,-1,7])。当我使用“for..of”循环时,它返回“NaN”,但常规 for 循环“(var i = 0; i

“for..of”的迭代方式与常规 for 循环有何不同?

var array = [2,-1,7,-7];

var largestSubArray = function (array) {
    var current = 0;
    var newest = 0;

    for(var i of array){
        newest = Math.max(0, newest + array[i]);
        current = Math.max(newest, current);
    }
    return current;
};
console.log(largestSubArray(array));

// Returns NaN, should return 8

【问题讨论】:

  • for..of 中,i 是值而不是键。尝试在控制台中记录i
  • 您应该检查 Array.reduce() 它是内置的,并且无需编写 for 循环即可执行您想要的操作。
  • 感谢斯蒂芬和安德烈亚斯的建议。两者都阅读了文档,并在发布之前使用 reduce 实现了这一点,但不了解两个循环之间的区别。 Rob 的回答让它点击了。

标签: javascript ecmascript-6


【解决方案1】:

i 不是当前索引,它是当前值。试试这个:

for(var i of array){
    newest = Math.max(0, newest + i);
    current = Math.max(newest, current);
}

【讨论】:

    【解决方案2】:

    改变

    newest = Math.max(0, newest + array[i]);
    

    newest = Math.max(0, newest + i);
    

    【讨论】:

      【解决方案3】:

      我认为您将for...offor...in 混淆了。两者之间的区别在于迭代期间存储在i 中的内容。两者都区分数组元素的valueindex(分别)。

      for...of 将您的i 设置为迭代周期中当前元素的value

      for...in 将您的i 设置为迭代周期中当前元素的value

      将来测试这个更简单的方法是console.log 你的变量。一个简单的测试通过稍微修改您的代码来说明上述行为:

      var array = [2,-1,7,-7];
      
      var largestSubArray = function (array) {
          var current = 0;
          var newest = 0;
      
          for(var i of array){
              console.log(i, array[i]);
              newest = Math.max(0, newest + array[i]);
              current = Math.max(newest, current);
          }
          return current;
      };
      console.log(largestSubArray(array));
      

      在上面,结果如下:

      i      array[i]
      ================
      2      7
      -1     undefined
      7      undefined
      -7     undefined
      
      NaN
      

      这是因为i 等于上面代码中的value。但是,将其从 for...of 更改为 for...in 将产生以下结果:

      i      array[i]
      ================
      0      2
      1      -1
      2      7
      3      -7
      
      8
      

      请注意您的线路newest = Math.max(0, newest + array[i]);。在您的原始代码中,array[i] 在使用 for...of 循环时可以简单地替换为 i

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        相关资源
        最近更新 更多