ES6减少不能按预期工作

时间:2017-12-30 14:15:07

标签: javascript ecmascript-6

我有一个名为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
  }
];

我希望通过将每个项目pricecount加起来来计算总价格:

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

但我得到 NaN 而不是总价,任何人都可以提供帮助?谢谢!

3 个答案:

答案 0 :(得分:5)

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

所以使用

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

答案 1 :(得分: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);

答案 2 :(得分:0)

使用

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

我认为你得到了减少错误的想法。第一个参数是一个累加器(之前所有的reduce迭代的结果),因此不需要将它乘以你的情况中的任何东西。您只需计算当前订单的价格并将其添加到累加器。

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