[英]JS callback function issue?
我正在尝试创建一个接受数组和回调函数的函数。 如果传递给回调的数组中的所有值都返回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
});
预期结果=>假,但我做对。
从forEach
回调中返回false
不会导致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
循环将为您带来相同的性能优势。
我建议使用一个简单的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}));
您可能为此使用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}) );
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
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.