繁体   English   中英

JS回调函数问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM