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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.