【问题标题】:ES6 reduce not workd as expectedES6 reduce 无法按预期工作
【发布时间】:2017-12-30 22:23:54
【问题描述】:

我有一个名为 orders 的数组,

const orders = [
  {
    name: 'iPhone 7',
    price: 7199,
    count: 2
  },
  {
    name: 'iPad 2',
    price: 3399,
    count: 1
  },
  {
    name: 'Macbook Pro',
    price: 19888,
    count: 1
  },
  {
    name: 'Kindle Osis',
    price: 2399,
    count: 2
  }
];

我想通过将每个项目的 price 乘以 count 来计算总价格,如下所示:

orders.reduce((e1, e2) => e1.price * e1.count + e2.price * e2.count);

但我得到的是 NaN 而不是总价,有人可以帮忙吗?谢谢!

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

  • 忘记将0 作为和的初始值传递
  • 没有考虑到回调的第一个参数是上一次调用的numeric结果,而不是带有属性的数组元素。

所以用

orders.reduce((sum, el) => sum + el.price * el.count, 0);

【讨论】:

    【解决方案2】:

    您可以将 Array#reduce 用作总和的起始值,然后仅乘以实际值。

    对于值,您可以使用destructuring assignment,因为您只需要pricecount 这两个属性。

    const orders = [{name: 'iPhone 7', price: 7199, count: 2}, {name: 'iPad 2', price: 3399, count: 1}, {name: 'Macbook Pro', price: 19888, count: 1}, {name: 'Kindle Osis', price: 2399, count: 2}],
        total = orders.reduce((sum, { price, count }) => sum + price * count, 0);
        //                                                                    ^
    
    console.log(total);

    【讨论】:

      【解决方案3】:

      使用

      orders.reduce((accumulator, order) => accumulator + order.price * order.count, 0);
      

      我认为您对 reduce 的理解是错误的。第一个参数是一个累加器(reduce 之前所有迭代的结果),所以在你的情况下不需要将它乘以任何东西。您只需计算当前订单的价格并将其添加到累加器中即可。

      0 是累加器在第一次迭代期间使用的初始值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 2013-12-23
        • 2014-12-09
        • 2016-01-13
        • 2020-09-21
        • 2011-08-17
        • 2012-04-29
        • 2021-08-12
        相关资源
        最近更新 更多