您好我正在运行一些测试,看看两者的输出是否为真。问题是,鉴于这些条件:
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;
}
}
&#13;
答案 0 :(得分:1)
在你的第二个版本中,内部回调函数中的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