我正在尝试创建一个接受数组和回调函数的函数。如果传递给回调的数组中的所有值都返回true,则该函数应返回true,否则,返回false。但是我不确定我做错了什么
const every = function(arr, callback) {
arr.forEach(function(element) {
if(!callback(element)) {
return false
}
})
return true
};
every([1, 2, 3, 4, 5], function(val) {
return val < 2
});
预期结果=>否 但我是真的。
答案 0 :(得分:1)
从false
回调返回forEach
也不会导致every
函数返回。相反,它将仅继续forEach
迭代器。
最简单的解决方案是for...of
循环,因为它允许您使用类似于代码段的return
模式:
const every = function(arr, callback) {
for (const element of arr) {
if (!callback(element)) {
return false;
}
}
return true;
};
console.log(every([1, 2, 3, 4, 5], function(val) {
return val < 2;
}));
注意:通过使用循环结构every
提早返回。数组的forEach
方法始终运行,直到访问了所有数组元素为止,但是在一个元素未通过测试后,循环立即中断。常规的for
循环将为您带来相同的性能优势。
答案 1 :(得分:1)
我建议使用简单的for循环:
const every = (arr, callback) => {
for (let i = 0; i < arr.length; i++){
if (callback(arr[i]) === false){
return false;
}
}
return true;
};
console.log(every([1, 2, 3, 4, 5], function(val){return val < 2}));
答案 2 :(得分:0)
您可能为此使用reduce()。如果您根据减少情况的真实性和回调的结果,只要回调为true,它就将保持为true。一旦回调为假,条件中对truth
的检查将使逻辑短路,并且回调将不再执行。但是它将遍历所有元素。
对于一个空数组,它也返回true,这似乎与您的原始逻辑意图相符。
const every = function(arr, callback) {
return arr.reduce(function(truth, element){
return truth && callback(element);
}, true);
};
console.log(
every([1, 2, 3, 4, 5], function(val){return val < 2})
);
console.log(
every([], function(val){return val < 2})
);
答案 3 :(得分:0)
arr.forEach(function(element) {
return false
})
它的内部函数返回false,这对外部函数没有影响(在这种情况下) 您应该在外部函数内部创建一个新变量,而不是在内部函数中返回false,而是更改该变量 最后只需返回变量
const every = function(arr, callback) {
let isEvery = true
arr.forEach(function(element) {
if(!callback(element)) { // or just isEvery = isEvery && statement
isEvery = false
}
})
return isEvery
};