[英]How to sum values in object with nested arrays?
我有以下结构:
groupedData = {
rice: [
{
name: 'white rice'
quantity: 2
category: 'rice'
},
{
name: 'brown rice'
quantity: 1
category: 'rice'
}
],
water: [
{
name: 'sparkle water'
quantity: 1
category: 'water'
},
{
name: 'still water'
quantity: 1
category: 'water'
}
],
tea: [{
name: 'green tea'
quantity: 1
category: 'water'
}],
}
我想要实现的是每个类别的总和数量,例如:米:3,水:2,茶:1
我尝试了以下方法:
const sum = () => {
let quantity = []
for (var property in groupedData) {
for (let i=0; i< groupedData[property].length; i++){
quantity[property] = groupedData[property][i].quantity;
}
}
return quantity;
}
但它不返回汇总数据,而只返回第一项的数量[rice: 2, water: 1, tea: 1]
您的解决方案不会添加节点。 只需添加每个节点的quantity
const groupedData = { rice: [ { name: 'white rice', quantity: 2, category: 'rice' }, { name: 'brown rice', quantity: 1, category: 'rice' } ], water: [ { name: 'sparkle water', quantity: 1, category: 'water' }, { name: 'still water', quantity: 1, category: 'water' } ], tea: [ { name: 'green tea', quantity: 1, category: 'water' }], }; const sum = () => { let quantity = {} for (var property in groupedData) { for (let i = 0; i < groupedData[property].length; i++) { quantity[property] = quantity[property] ? quantity[property] : 0; quantity[property] += groupedData[property][i].quantity; } } return quantity; }; console.log(sum());
您还可以使用Object.entries
、 Array.forEach
和Array.reduce
来实现这一点。
const groupedData = { rice: [ { name: 'white rice', quantity: 2, category: 'rice' }, { name: 'brown rice', quantity: 1, category: 'rice' } ], water: [ { name: 'sparkle water', quantity: 1, category: 'water' }, { name: 'still water', quantity: 1, category: 'water' } ], tea: [ { name: 'green tea', quantity: 1, category: 'water' }], }; const sum = () => { let quantity = {}; Object.entries(groupedData).forEach(([key, value]) => { quantity[key] = value.reduce((acc, { quantity }) => acc += quantity, 0) }); return quantity; }; console.log(sum());
const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', } ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', } ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }], } const sum = () => { let quantity = {} for (var property in groupedData) { for (let i = 0; i < groupedData[property].length; i++) { quantity = { ...quantity, [property]: quantity[property] ? quantity[property] + groupedData[property][i].quantity : groupedData[property][i].quantity } } } return quantity; } console.log(sum());
const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', } ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', } ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }], } const sum = () => { let res = {} for (var props in groupedData) { const item = groupedData[props].reduce((acc, cur) => { acc += cur.quantity; return acc; }, 0); res[props] = item; } return res; } console.log(sum());
你可以这样做:
const result = Object.entries(groupedData).reduce((prev, [k, v]) => {
const sums = {
...prev,
[k]: v.reduce((p, c) => p + c.quantity, 0),
}
return sums
}, {})
这是完整的片段:
const groupedData = { rice: [{ name: 'white rice', quantity: 2, category: 'rice', }, { name: 'brown rice', quantity: 1, category: 'rice', }, ], water: [{ name: 'sparkle water', quantity: 1, category: 'water', }, { name: 'still water', quantity: 1, category: 'water', }, ], tea: [{ name: 'green tea', quantity: 1, category: 'water', }, ], } const result = Object.entries(groupedData).reduce((prev, [k, v]) => { const sums = { ...prev, [k]: v.reduce((p, c) => p + c.quantity, 0), } return sums }, {}) console.log(result)
并且作为单班轮......
var result = Object.keys(groupedData).reduce((prev, key) => ({...prev,[key]: groupedData[key].reduce((total,item)=>total+item.quantity,0)}),{});
console.log(result);
使用 Object.entries 可能更具可读性
var result2 = Object.entries(groupedData).reduce((prev, [k, v]) => ({...prev, [k]: v.reduce((total,item)=>total+item.quantity,0)}),{});
console.log(result2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.