gpt4 book ai didi

Javascript forEach 不提供与普通 for 循环相同的输出

转载 作者:行者123 更新时间:2023-12-03 05:12:06 24 4
gpt4 key购买 nike

您好,我正在运行一些测试来查看两者的输出是否正确。问题是,考虑到这些条件:

var callback = function (num) {
return num % 2 === 0
}

console.log($$$.any([1, 3, 4], callback) === true)
console.log($$$.any([1, 11, 111], callback) === false)

我必须创建一个函数,在两种情况下都给出正确的结果。我用 for 循环做到了,但用 forEach 却无法得到相同的结果,这是为什么?:

// My for loop function:

$$$ = {
any: function (arr, callback) {
for (var i = 0, l = arr.length; i < l; i ++) {
if (callback(arr[i])) {
return true;
}
}
return false;
}
}

// My forEach function:

$$$={
any: function(array, callback){
array.forEach(function(value){
// console.log(value)
if (callback(value)) {
return true;
}
// return false;
})
return false;
}
}

最佳答案

在您的第二个版本中,内部回调函数中的return true仅从该回调函数返回,并且不会导致外部函数返回。

.forEach 循环将运行至完成,然后 .any 函数本身总是返回false .

FWIW,.forEach 并不真正适合 .any 函数,因为一旦找到匹配项就无法终止对元素的迭代,因此它的效率低于应有的水平。例如,您可能有一个包含 10000 个元素的数组,但使用 .forEach 它将继续循环,即使第一个元素满足您的谓词。

也就是说,如果您确实必须使用 .forEach,那么解决方案是:

function all(array, callback) {
var result = false;
array.forEach(function(value) {
if (callback(value)) {
result = true;
}
});
return result;
}

可以进一步优化,至少避免在找到匹配项后调用用户提供的回调:

function all(array, callback) {
var result = false;
array.forEach(function(value) {
if (!result && callback(value)) {
result = true;
}
});
return result;
}

注意:JavaScript 已经有一个函数可以满足您的要求 - Array.prototype.some

关于Javascript forEach 不提供与普通 for 循环相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41762196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com