对对象数组中的嵌套对象值求和

Sum the nested object values in an object array

我有一个对象数组 -

[{
    title: "oranges",
    id: 5802537,
    cart: {
      purchased: 3,
      stockTotal: 9
    },
    price: 3,
    department: "fresh fruit and veg"
  },
  {
    title: "pasta",
    id: 5802537,
    cart: {
      purchased: 2,
      stockTotal: 15
    },
    price: 1,
    department: "dry goods"
  },
  {
    title: "eggs",
    id: 5802537,
    cart: {
      purchased: 1,
      stockTotal: 11
    },
    price: 2,
    department: "baking"
  }
]

我正在尝试编写一个函数,它将所有 stockTotal 加起来并从每个对象购买。 我试过这个 -

let val = items.reduce(function(previousValue, currentValue) {
  return {
    purchased: previousValue.cart.purchased + currentValue.cart.purchased,
    stockTotal: previousValue.cart.stockTotal + currentValue.cart.stockTotal
  };
});

console.log(val);

但是说读不到属性'purchased' of undefined,读不到属性 'stockTotal' of undefined。 我想知道这是否是因为 stockTotal 和 purchased 位于数组中每个对象中的它们自己的对象中?

您需要为 reduce 累加器提供一个初始值(previousValue,我已将其更改为 acc),并在每次迭代中从 acc 中获取当前值(或使用 0 作为后备),并向其添加项目的值:

const items = [{"title":"oranges","id":5802537,"cart":{"purchased":3,"stockTotal":9},"price":3,"department":"fresh fruit and veg"},{"title":"pasta","id":5802537,"cart":{"purchased":2,"stockTotal":15},"price":1,"department":"dry goods"},{"title":"eggs","id":5802537,"cart":{"purchased":1,"stockTotal":11},"price":2,"department":"baking"}];

const val = items.reduce(function(acc, currentValue) {
  return {
    purchased: (acc.purchased ?? 0) + currentValue.cart.purchased,
    stockTotal: (acc.stockTotal ?? 0) + currentValue.cart.stockTotal
  };
}, {});

console.log(val);

const data = [{title:"oranges",id:5802537,cart:{purchased:3,stockTotal:9},price:3,department:"fresh fruit and veg"},{title:"pasta",id:5802537,cart:{purchased:2,stockTotal:15},price:1,department:"dry goods"},{title:"eggs",id:5802537,cart:{purchased:1,stockTotal:11},price:2,department:"baking"}];

let purchased = 0, //set initial values
  stockTotal = 0;
for (let item of data) { // loop items
  purchased += item.cart.purchased; // increment initial values
  stockTotal += item.cart.stockTotal;
}
console.log(purchased, stockTotal);