【问题标题】:Why does reduce not print the first value?为什么减少不打印第一个值?
【发布时间】:2022-01-06 22:27:39
【问题描述】:

我正在尝试在这里学习如何使用 reduce,这只会记录 b,c,d

['a', 'b', 'c', 'd'].reduce(function(acc, cur){
  console.log(cur);
  return cur;
})

我也不明白累加器是什么。即使阅读了文档,我也不知道这是如何工作的。

Current 似乎不是current,因为'a' 被跳过。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

编辑:这是一组更好的测试用例:

【问题讨论】:

    标签: javascript


    【解决方案1】:

    reduce 的要点是它依次从数组中取出每个元素,对该元素和上一次迭代的输出(“累加器”)执行二元运算,然后重复该过程直到输入数组已用尽。

    也就是说,给定[a, b, c, d].reduce(f) 它确实:

       f(a, b)
    -> f(f(a, b), c)
    -> f(f(f(a, b), c), d)
    

    您只记录第二个参数,因此您的 a 永远不会出现。

    (为方便起见,我忽略了传递给f 的额外indexarray 参数)

    如果您想将数组中第一个元素以外的其他元素用作第一个左手操作数,则使用您未提供的可选“初始值”参数。如果您不提供它,那么正如您所发现的,acccur 的第一个值将是 "a""b"

    reduceRight 函数从数组的另一端获取参数:

       f(c, d)
    -> f(b, f(c, d))
    -> f(a, f(b, f(c, d)))
    

    【讨论】:

      【解决方案2】:

      根据Array#reduce的API,如果累加器不应该是第一个元素,则需要指定initialValue

      初始值

      [可选] 用作回调第一次调用的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用 reduce 是错误的。

      ['a', 'b', 'c', 'd'].reduce(function(acc, cur){
          console.log(cur);
          return cur;
      }, undefined);
      // ^^^^^^^^^

      【讨论】:

        【解决方案3】:

        当我看到真实世界的例子时,我更容易理解事情,所以假设我们有一个这样的数组:

        let products = [
            { label: 'Product 1', price: 5  },
            { label: 'Product 2', price: 15 },
            { label: 'Product 3', price: 20 },
        ];
        

        然后我们要统计总价:

        let totalPrice = products.reduce((acc, product) => {
            return acc + product.price;
        }, 0); // 0 - initial value
        
        console.log(totalPrice);
        

        并且它不会记录a,因为如果没有指定初始值,它将以第一个元素作为初始值。

        【讨论】:

          【解决方案4】:

          第一次中的第一个参数是[0],第二个是[1]。

          时间内,第一个参数是 f([0],[1]),第二个是 [2],等等

          【讨论】:

            【解决方案5】:

            正如docs 提到的那样

            reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,以将其减少为单个值。

            这清楚地说明了

            ['a', 'b', 'c', 'd'].reduce(function(acc, cur){
              console.log(cur);
              return cur;
            })
            

            reduce 每次将 acc 值作为 a,b,ccur 作为 b,c,d

            每次你得到一对a,bb,c,c,d

            【讨论】:

              【解决方案6】:

              例如,

              ['a', 'b', 'c', 'd'].reduce(function(acc, cur){
                console.log(acc);
                return acc+cur;
              })
              

              您将获得以下信息:

              ab
              abc
              abcd
              

              array.reduce() 一次取数组中的一个元素,并根据回调函数产生输出并将其存储在累加器中。因此,对于每次迭代,您将拥有上一个结果(累加器)和当前元素以产生下一个结果。累加器值从数组中第一个元素的值开始。

              【讨论】:

                猜你喜欢
                • 2016-02-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-04
                • 2020-07-05
                • 2020-06-18
                • 1970-01-01
                • 2022-06-10
                • 1970-01-01
                相关资源
                最近更新 更多