tengo la siguiente estructura:
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' }], }Lo que quiero lograr es tener una cantidad sumada de cada categoría, así: arroz: 3, agua: 2, té: 1
Intenté lo siguiente:
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; } pero no devuelve datos sumados sino solo la cantidad del primer artículo [rice: 2, water: 1, tea: 1]
Su solución no agrega los nodos. Solo agrega la quantity de cada nodo
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()); También puede utilizar Object.entries , Array.forEach y Array.reduce para lograrlo.
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());Puedes hacer algo como esto:
const result = Object.entries(groupedData).reduce((prev, [k, v]) => { const sums = { ...prev, [k]: v.reduce((p, c) => p + c.quantity, 0), } return sums }, {})Aquí está el fragmento completo:
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)