I have array with nested objects, want to add sum of value and make an object in 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,
},
},
];
I have done for one object, so want do multiple object
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: {},
}
);
console.log(result)
Here I attach the fiddle link
I got out put for "preliminary" value. I need all of object mean needs to do dynamically. Thanks in advance.
We can use Array.reduce() several times in combination with Object.entries() to add the properties at the correct level in the structure, the end result should be as required:
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, iterate over the array while updating an object accumulator
Object#keys, iterate over the keys of the object at hand
prev to the the value of the key saved in the accumulator if exists, and current to the value in the object at handObject#keys and Array#forEach, iterate over its keys and update the accumulatorconst 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);
this is my solution:
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)