JS回调函数问题?

时间:2019-01-04 23:35:59

标签: javascript arrays foreach callback

我正在尝试创建一个接受数组和回调函数的函数。如果传递给回调的数组中的所有值都返回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
});

预期结果=>否 但我是真的。

4 个答案:

答案 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
};