1

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.

1
  • what is your expected result? Commented Oct 7, 2021 at 7:45

4 Answers 4

2

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; }

Sign up to request clarification or add additional context in comments.

Comments

1

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)

Comments

1
  • Using Array#reduce, iterate over the array while updating an object accumulator
    • In every iteration, using Object#keys, iterate over the keys of the object at hand
      • Set prev to the the value of the key saved in the accumulator if exists, and current to the value in the object at hand
      • If no previous value was saved for this key in the accumulator set the object to it
      • Otherwise, using Object#keys and Array#forEach, iterate over its keys and update the accumulator

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);

Comments

0

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, }, total: { contract_value: "7000.00", planned_value: "3500.00", balance_value: "3500.00", }, }, { 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, }, total: { contract_value: "700.00", planned_value: "350.00", balance_value: "350.00", }, }, ]; const result = arr.reduce((obj, outerKeys) => { Object.keys(outerKeys).map((outerKey) => { // console.log(`outerKey:::`, outerKey); // console.log(`values[outerKey]:::`, outerKeys[outerKey]); // console.log(`obj:::`, obj); if (obj[outerKey]) { const tempObject = outerKeys[outerKey]; Object.keys(tempObject).map((objKey) => { const tempInnerObject = obj[outerKey]; tempInnerObject[objKey] = Number(tempInnerObject[objKey]) + Number(tempObject[objKey]); // console.log(`objKey:::`, objKey); // console.log(`tempObject[objKey]:::`, tempObject[objKey]); }); } else { obj[outerKey] = outerKeys[outerKey]; } }); return obj; }, {}); console.log(`result :::`, result);

1 Comment

I think, it's an opportunity for everyone to look at other people logic and improve your logic building :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.