【问题标题】:Why would for loop and forEach work different? [duplicate]为什么 for loop 和 forEach 的工作方式不同? [复制]
【发布时间】:2021-04-12 14:54:04
【问题描述】:

这是在给定数组中查找重复项的简单 LeetCode 函数。

function findDuplicates(nums) {
    let hash = {}
    for (let i = 0; i < nums.length; i++) {
        if (!hash[nums[i]]) {
            hash[nums[i]] = true
        } else {
            return true
        }
    }
    
    return false
}

效果很好。但是如果我们改用 forEach 方法会发生什么?

function findDuplicates(nums) {
    let hash = {}
    nums.forEach(el => {
        if (!hash[el]) {
            hash[el] = true
        } else {
            return true
        }
    });

    return false
}

此函数不适用于[0,4,5,3,0,6] 的相同输入。 您能否解释一下为什么这两种解决方案会给出不同的结果?或者只是为我指明正确的方向。

【问题讨论】:

  • 在第一个示例中,您在 findDuplicates 函数中是 returning,立即停止它。在第二个中,您是forEach 中的returning,这不会阻止其他迭代的运行(对于return 中的forEach 中的值是无用的,因为它不能在任何地方使用)
  • 改用for (const el of nums) {。另外我会推荐Set 而不是hash = {}
  • ... 或者,使用every,简单地使用return nums.every((el, i) =&gt; nums.indexOf(el) === i);(没有任何forforEach
  • @blex 这个函数的bigO是什么?使用 hash = {} 使其 O(n)
  • 我不知道如何计算它,但是是的,使用它比将遇到的值存储在hash 变量中效率低(对于every 元素,它将执行indexOf ,它也会在内部循环)。在大多数日常使用中无关紧要(它使代码更易于阅读 IMO,并且时间差异不会很明显),但如果您拥有庞大的数据集,它确实会产生影响

标签: javascript arrays loops


【解决方案1】:

return语句相当于break,for循环可以断,foreach不能。

【讨论】:

猜你喜欢
  • 2023-03-06
  • 2013-12-10
  • 2011-12-21
  • 2015-11-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多