Tengo una matriz con objetos anidados, quiero agregar una suma de valor y crear un objeto en javascript.
const arr = [ { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500, }, substructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, architectural: { contract_value: 1000, planned_value: 500, balance_value: 500, }, mande: { contract_value: 1000, planned_value: 500, balance_value: 500, }, externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500, }, miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500, }, }, { preliminary: { contract_value: 100, planned_value: 50, balance_value: 50, }, substructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, superstructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, architectural: { contract_value: 100, planned_value: 50, balance_value: 50, }, mande: { contract_value: 100, planned_value: 50, balance_value: 50, }, externalwork: { contract_value: 100, planned_value: 50, balance_value: 50, }, miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50, }, },];
Lo he hecho para un objeto, así que quiero hacer varios objetos.
const result = arr.reduce( (obj, { preliminary, ...rest }) => { return ( Object.keys(preliminary).map( (key) => (obj.preliminary[key] = preliminary[key] + (Number(obj.preliminary[key]) || 0)) ), obj ); }, { preliminary: {}, substructure: {}, superstructure: {}, architectural: {}, mande: {}, externalwork: {}, miscorcontingency: {}, });
consola.log(resultado)
Aquí adjunto el enlace del violín.
Salí puesto por valor "preliminar". Necesito todas las necesidades medias de objetos para hacer dinámicamente. Gracias por adelantado.
Podemos usar Array.reduce() varias veces en combinación con Object.entries() para agregar las propiedades en el nivel correcto en la estructura, el resultado final debería ser el requerido:
const arr = [ { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500, }, substructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500, }, architectural: { contract_value: 1000, planned_value: 500, balance_value: 500, }, mande: { contract_value: 1000, planned_value: 500, balance_value: 500, }, externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500, }, miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500, }, }, { preliminary: { contract_value: 100, planned_value: 50, balance_value: 50, }, substructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, superstructure: { contract_value: 100, planned_value: 50, balance_value: 50, }, architectural: { contract_value: 100, planned_value: 50, balance_value: 50, }, mande: { contract_value: 100, planned_value: 50, balance_value: 50, }, externalwork: { contract_value: 100, planned_value: 50, balance_value: 50, }, miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50, }, }] const result = arr.reduce((acc, cur) => { return Object.entries(cur).reduce((acc, [key1, val1]) => { return Object.entries(val1).reduce((acc, [key2, val2]) => { acc[key1] = acc[key1] || {}; acc[key1][key2] = (acc[key1][key2] || 0) + val2; return acc; }, acc) }, acc) }, {}) console.log('Result:',result) .as-console-wrapper { max-height: 100% !important; top: 0; }Array#reduce , itere sobre la matriz mientras actualiza un acumulador de objetosObject#keys , itere sobre las claves del objeto en cuestiónprev al valor de la clave guardada en el acumulador si existe, y current al valor en el objeto en cuestiónObject#keys y Array#forEach , itere sobre sus claves y actualice el acumulador const arr = [ { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500 }, substructure: { contract_value: 1000, planned_value: 500, balance_value: 500 }, superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500 }, architectural: { contract_value: 1000, planned_value: 500, balance_value: 500 }, mande: { contract_value: 1000, planned_value: 500, balance_value: 500 }, externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500 }, miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500 } }, { preliminary: { contract_value: 100, planned_value: 50, balance_value: 50 }, substructure: { contract_value: 100, planned_value: 50, balance_value: 50 }, superstructure: { contract_value: 100, planned_value: 50, balance_value: 50 }, architectural: { contract_value: 100, planned_value: 50, balance_value: 50 }, mande: { contract_value: 100, planned_value: 50, balance_value: 50 }, externalwork: { contract_value: 100, planned_value: 50, balance_value: 50 }, miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50 } } ]; const res = arr.reduce((acc, obj) => { Object.keys(obj).forEach(key => { const prev = acc[key], current = obj[key]; if(!prev) acc[key] = current; else Object.keys(current).forEach(k => prev[k] = (prev[k] || 0) + current[k]); }); return acc; }, {}); console.log(res);esta es mi solucion:
const arr = [ { preliminary: { contract_value: 1000, planned_value: 500, balance_value: 500 }, substructure: { contract_value: 1000, planned_value: 500, balance_value: 500 }, superstructure: { contract_value: 1000, planned_value: 500, balance_value: 500 }, architectural: { contract_value: 1000, planned_value: 500, balance_value: 500 }, mande: { contract_value: 1000, planned_value: 500, balance_value: 500 }, externalwork: { contract_value: 1000, planned_value: 500, balance_value: 500 }, miscorcontingency: { contract_value: 1000, planned_value: 500, balance_value: 500 } }, { preliminary: { contract_value: 100, planned_value: 50, balance_value: 50 }, substructure: { contract_value: 100, planned_value: 50, balance_value: 50 }, superstructure: { contract_value: 100, planned_value: 50, balance_value: 50 }, architectural: { contract_value: 100, planned_value: 50, balance_value: 50 }, mande: { contract_value: 100, planned_value: 50, balance_value: 50 }, externalwork: { contract_value: 100, planned_value: 50, balance_value: 50 }, miscorcontingency: { contract_value: 100, planned_value: 50, balance_value: 50 } } ]; let result = arr.reduce((out, cv, ci)=>{ if(ci == 0) return out; Object.keys(cv).forEach(key => { Object.keys(cv[key]).forEach(key2 => { (out[key] ??= {})[key2] += cv[key][key2]; }) }); return out; }, arr[0] ); console.log(result)