Necesito entender la forma más simple de hacer esto. Tengo una serie de objetos:
const data = [ { group: 'A', incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15 } }, { group: 'B', incomes: { "2019-12": 25, "2020-12": 50, } } ]Lo que estoy tratando de obtener es un objeto simple donde su clave es el mes de data. incomes y el valor es la suma de los valores relativos del mes, por lo que el resultado final se ve así:
const totalIncomes = { "2019-12": 125, "2020-12": 250, "2021-12": 15 }¿Alguien me lo puede explicar paso a paso, por favor?
resuelto usando reduce y forEach
Dentro de la función de reducción, estoy ejecutando un forEach en la matriz de claves del objeto/atributo de incomes . Para cada clave que es una fecha, estoy comprobando si el acumulador de la función de reducción contiene un atributo para cada fecha y crea si no. Después de crear el atributo, estoy sumando el valor del atributo de fecha actual.
const data = [ { group: 'A', incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15 } }, { group: 'B', incomes: { "2019-12": 25, "2020-12": 50, } } ] const totalIncomes = data.reduce((acc,curr)=> { Object.keys(curr.incomes).forEach((key, index) => { if(!acc[key]){ acc[key] = 0; } acc[key]+=curr.incomes[key] }); return acc; },{}) console.log(totalIncomes)Tal vez esta no sea la solución más bonita, pero puede hacerlo así, la función, por supuesto, no es necesaria.
const data = [ { group: "A", incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15, }, }, { group: "B", incomes: { "2019-12": 25, "2020-12": 50, }, }, ]; getterInformation(data); function getterInformation(object) { let objectWithCalculatedValues = {}; object.forEach((items) => { for (const key in items.incomes) { if (objectWithCalculatedValues[key] === undefined) { objectWithCalculatedValues[key] = 0; } objectWithCalculatedValues[key] += items.incomes[key]; } }); console.log(objectWithCalculatedValues); }Suponiendo que esta información pueda ser útil para los lectores que no puedan obtener la orientación necesaria (debido a varias razones posibles), aquí hay una forma posible de lograr el objetivo (solución):
const aggregateIncomesByMonth = () => ( data.map(d => Object.entries(d.incomes).map(([k, v]) => ({ key: k, value: v }))).flat().reduce((fin, itm) => ({ ...fin, [itm.key]: (fin[itm.key] || 0) + itm.value }), {}) );Explicación
incomes de la matriz de dataincome , obtenga el par clave-valor y transfórmelo en otro objeto de la estructura {key: 20yy-mm, value: nn}.flat() para transformar el resultado del paso 2 en una matriz unidimensional.reduce para sumar el value de aquellos casos en los que coincida la key (es decir, 20yy-mm).Fragmento de código
const data = [{ group: 'A', incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15 } }, { group: 'B', incomes: { "2019-12": 25, "2020-12": 50, } } ]; const aggregateIncomesByMonth = () => ( data.map(d => Object.entries(d.incomes).map(([k, v]) => ({ key: k, value: v }))).flat().reduce((fin, itm) => ({ ...fin, [itm.key]: (fin[itm.key] || 0) + itm.value }), {}) ); console.log(aggregateIncomesByMonth());