Estoy tratando de fusionar una matriz de objetos sumando los totales de cada par clave-valor en el objeto de totales. Por ejemplo, la siguiente matriz produciría un objeto con un totals de 3 manzanas y 5 naranjas. Esto debe ser dinámico. Si las peras fueran una clave en otro objeto, el objeto resultante incluiría tres claves debajo del objeto de totals : manzanas, naranjas y peras.
Entrada de muestra:
[ { summary: { totals: { apples: 2, oranges: 3 } } }, { summary: { totals: { apples: 1, oranges: 2 } } } ]Rendimiento esperado:
{ summary:{ totals:{ apples:3, oranges:5 } } }Lo que he probado:
function mergeObjects(arr) { let shape = { summary:{ totals:{} } } return arr.reduce((prev, cur) => { if(cur.summary.totals.apples){ shape.summary.totals.apples.push(cur.summary.totals.apples) } }, shape); }Array#reduce , itere sobre la matriz mientras actualiza un objetoObject#entries y
, itere sobre los pares de totales actuales y actualice el acumulador. const arr = [ { summary: { totals: { apples: 2, oranges: 3 } } }, { summary: { totals: { apples: 1, oranges: 2 } } }, ]; const res = arr.reduce((map, current) => { const { totals: currentTotals = {} } = current.summary ?? {}; const { totals } = map.summary; Object.entries(currentTotals).forEach(([ key, value ]) => { totals[key] = (totals[key] ?? 0) + value; }); return map; }, { summary: { totals: {} } }); console.log(res);Puedes intentar algo como. Simplemente recorra la matriz y sume manzanas y naranjas.
const arr = [ { summary: { totals: { apples: 2, oranges: 3, }, }, }, { summary: { totals: { apples: 1, oranges: 2, }, }, }, ]; function mergeObjects(arr) { let shape = { summary:{ totals:{ apples:0, oranges:0 } } } arr.forEach(x => { if(x.summary.totals.apples){ shape.summary.totals.apples += x.summary.totals.apples; shape.summary.totals.oranges += x.summary.totals.oranges; } }); return shape; } let result = mergeObjects(arr); console.log(result);La segunda opción de la función reduce inicializa el valor.
¡Y el valor inicializado se puede usar en anterior!
[1] almacenar el valor en anterior.
[2] anterior puede acumular valores. Tienes que volver a utilizar el valor acumulado. Si no se devuelve, el valor será indefinido.
[3] apples no es un tipo de matriz, por lo que no puede usar el método push. es un tipo de número, debe usar un operador numérico.
function mergeObjects(arr) { const shape = { summary: { totals: {}, }, }; return arr.reduce((prev, cur) => { const { apples, oranges } = cur.summary.totals; // [1] prev.summary.totals.apples // [3] ? (prev.summary.totals.apples += apples) : (prev.summary.totals.apples = apples); prev.summary.totals.oranges ? (prev.summary.totals.oranges += oranges) : (prev.summary.totals.oranges = oranges); // [2] return prev; }, shape); }¡puntas!
const { apples, oranges } = cur.summary.totals; prev.summary.totals.apples ? (prev.summary.totals.apples += apples) : (prev.summary.totals.apples = apples);