Javascript 为什么for循环和forEach的工作方式不同?
下面是一个简单的LeetCode函数,用于在给定数组中查找重复项Javascript 为什么for循环和forEach的工作方式不同?,javascript,arrays,loops,Javascript,Arrays,Loops,下面是一个简单的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 } }
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
}
此功能不适用于[0,4,5,3,0,6]
的相同输入。
你能解释一下为什么这两种解决方案会产生不同的结果吗?或者只给我指出正确的方向。Return语句相当于break,因为循环可以断开,foreach不能断开。在第一个示例中,您在
findDuplicates
函数中执行Return
操作,立即停止它。在第二个迭代中,您在forEach
中执行return
操作,这不会阻止其他迭代的运行(并且返回forEach
中的值是无用的,因为它在任何地方都不可用)使用for(nums的常量){
相反。我还建议使用集合
来代替散列={}
…或者,使用简单地返回nums.every((el,I)=>nums.indexOf(el)==I);
(对于
或forEach
)@blex这个函数的bigO是什么?使用散列={}使它成为O(n)我不知道如何计算它,但是是的,使用它比将遇到的值存储在散列
变量(对于每个
元素,它将执行indexOf
,这也将在内部循环)中效率更低。在大多数日常使用中都不重要(这使代码更容易阅读,时间差不会明显),但如果你有庞大的数据集,它确实会产生“foreach不可能”的影响。这不是真的。你可以阻止foreach
循环(尽管它很难看):参考这个答案:没错。我的方法与提供的答案中的第二个示例类似
function findDuplicates(nums) {
let hash = {}
nums.forEach(el => {
if (!hash[el]) {
hash[el] = true
} else {
return true
}
});
return false
}