【问题标题】:JS callback function issue?JS回调函数问题?
【发布时间】:2019-01-04 23:35:59
【问题描述】:

我正在尝试创建一个接受数组和回调函数的函数。如果传递给回调的数组中的所有值都返回 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 方法的回调内部的返回在调用该方法的函数中完全没有。我建议过滤数组并测试结果长度。或者,较新版本的 JavaScript 实际上在数组上有一个 every 方法:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 只是我还是以语法错误的形式传递的回调?末尾的{} 看起来很奇怪
  • Array.prototype 有一个 every 可以满足您的需求,例如[1, 2, 3, 4, 5].every(val =&gt; val &lt; 2)
  • @ic3b3rg 他显然是想了解如何自己实现类似的功能。
  • @Barmar 不太确定他是否知道Array.prototype.every

标签: javascript arrays foreach callback


【解决方案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】:

    forEach 回调返回false 也不会导致every 函数返回。相反,它将简单地继续 forEach 迭代器。

    解决您的问题最简单的方法是使用for...of 循环,因为它允许您使用类似于您的 sn-p 的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 循环会给您带来同样的性能优势。

    【讨论】:

    • 很高兴知道这一点。我想知道为什么即使在满足条件后循环继续迭代。谢谢!
    【解决方案3】:

    您可能会为此使用 reduce()。如果你的归约基于回调的真相和结果,那么只要回调是真的,它就会保持真实。一旦回调为假,条件中对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})
    );

    【讨论】:

    • 尽管正如@ic3b3rg 指出的那样,Array.prototype.every 存在,并且似乎与 Array.prototype.reduce 具有接近相同的浏览器支持
    【解决方案4】:
    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
    };  
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2021-06-09
      相关资源
      最近更新 更多