Estoy tratando de encontrar la suma de todos los valores de campo de la matriz anidada, apesto explicando cosas como esta, espero que el código a continuación le brinde una idea de lo que quiero hacer.
La matriz se ve así
data = [ { id: 8434, name: listName, data: [ {name: "a name", quantity: 20, } {name: "another name", quantity: 40, } {name: "another new name", quantity: 40, } ] }, { id: 54343, name: "new list name", data: [ {name: "a name", quantity: 12, } {name: "another name", quantity: 10, } {name: "another new name", quantity: 16, } ] } ]Así quiero que queden los datos después de realizar la suma
transformed = [ {name: "a name", quantity: 32}, {name: "another name", quantity: 50}, {name: "another new name", quantity: 56} ]Puede usar Array.flatMap() seguido de Array.reduce() para obtener el resultado deseado.
Comenzamos llamando a .flatMap() para obtener todos los valores de datos, luego llamamos a .reduce() en estos para sumar cada valor por name .
Esto creará un objeto, con una propiedad para cada nombre, luego llamamos a Object.values() para volver a una matriz.
const data = [ { id: 8434, name: 'listName', data: [ { name: "a name", quantity: 20, }, { name: "another name", quantity: 40, }, { name: "another new name", quantity: 40, } ] }, { id: 54343, name: "new list name", data: [ { name: "a name", quantity: 12, }, { name: "another name", quantity: 10, }, { name: "another new name", quantity: 16, } ] } ]; const transformed = Object.values(data.flatMap(({ data }) => data).reduce((acc, { name , quantity }) => { acc[name] = acc[name] || { name, quantity: 0 }; acc[name].quantity += quantity; return acc; }, {})) console.log('Transformed:', transformed) .as-console-wrapper { max-height: 100% !important; }const transform = (data) => { const quantitySum = new Map() data.forEach(list => { list.data.forEach(({ name, quantity }) => { if (quantitySum.has(name)) { quantitySum.set(name, quantitySum.get(name) + quantity) } else { quantitySum.set(name, quantity) } }) }) return Array.from(quantitySum.entries()) .map(([name, sum]) => ({ name, quantity: sum })) }simplemente recíbalos y cree un nuevo objeto.
const data = [ { id: 8434, name: 'listName', data: [ { name: "a name", quantity: 20, }, { name: "another name", quantity: 40, }, { name: "another new name", quantity: 40, } ] }, { id: 54343, name: "new list name", data: [ { name: "a name", quantity: 12, }, { name: "another name", quantity: 10, }, { name: "another new name", quantity: 16, } ] } ] // Logic: const transformed = [] data.forEach(d => { d.data.forEach(item => { const exist = transformed.find(t => t.name == item.name) if(exist) exist.quantity += item.quantity else transformed.push(item) }) }) console.log(transformed)Producción:
[ { name: 'a name', quantity: 32 }, { name: 'another name', quantity: 50 }, { name: 'another new name', quantity: 56 } ]