【问题标题】:Difference between .reduce() and .every() in JavaScriptJavaScript 中 .reduce() 和 .every() 的区别
【发布时间】:2020-03-19 12:53:57
【问题描述】:

我正在尝试检查每个对象的o_ 是否存在。我用.every() 做这个。我们可以用.reduce() 做这个吗?这两者的性能对比如何?

const obj = level1.level2[level1.ID][P1];
checker = ['o_1', 'o_2', 'o_3', 'o_4'].every(key => obj[key] === undefined); 

【问题讨论】:

  • 您可以使用reduce() 执行此操作,但every() 将在谓词第一次失败时停止迭代,而reduce() 将继续迭代每个值。
  • 您当然可以使用reduce() 来执行此操作,但是它会传递整个数组,即使它会在第一个元素处发现缺少o_,而every() 会得到在发生故障时短路,因此执行得更快。

标签: javascript reactjs lodash


【解决方案1】:

.every() 返回一个布尔值 - 如果此数组中的每个元素都满足提供的测试函数,则返回 true。与 .every() 的一个重要区别是,可能并不总是为数组中的每个元素调用测试函数。一旦测试函数对任何元素返回 false,就不再迭代数组元素。因此,测试功能通常应该没有副作用。

.reduce()reduce() 方法对数组的每个元素执行(您提供的)reducer 函数,从而产生单个输出值。

【讨论】:

    【解决方案2】:

    大多数(如果不是全部)JavaScript 的高阶数组方法都可以使用.reduce() 来实现,但是也可能存在差异。在这种情况下,.every() 方法一旦发现谓词(即回调)返回 false,就会立即return false。这允许.every() 提前终止其迭代。但是,.reduce() 没有这种提前终止功能,因此一旦回调返回 false,它将继续检查数组中的所有其他剩余值。

    例如,一旦n < 3false,以下将停止比较元素:

    const arr = [1, 2, 3, 4, 5];
    
    const smaller_than_three = arr.every(n => {
      console.log("executing for " + n); // doesn't execute for 4 or 5 as we already know the result is false when `n` is 3
      return n < 3
    });
    
    console.log(smaller_than_three);

    但是,使用.reduce() 实现相同的逻辑不会提前终止“循环”:

    const arr = [1, 2, 3, 4, 5];
    
    const smaller_than_three = arr.reduce((acc, n) => {
      console.log("executing for " +n +", when result is: " +acc); // keeps executing, even after acc is `false`
      return acc && n < 3;
    }, true);
    
    console.log(smaller_than_three);

    就性能而言,这意味着.every() 可以有 O(1)最佳情况和 O(n)最坏情况。但是.reduce() 将有 O(n) 的最佳和最坏情况(假设您在回调中不断地为every 和reduce 工作)。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2012-07-07
      • 1970-01-01
      • 2011-11-12
      • 2011-02-02
      • 2014-02-27
      • 2016-06-22
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多