skvj
skvj

Reputation: 103

How to sum two object values in javascript

I'm stuck how i sum two object like this:

obj1 = { 
  'over_due_data': 10,
  'text_data': 5
} 

obj2 = {
  'over_due_data': 20,
  'text_data': 5
}

I went this output

obj = {
  'over_due_data': 30,
  'text_data': 10
}

One more thing, don't use a for loop, merge and extend. Is it possible to sum two objects?

Upvotes: 5

Views: 13055

Answers (7)

prasanth
prasanth

Reputation: 22500

try with simply use Object.keys() and Array#map() function

obj1 = {
  'over_due_data': 10,
  'text_data': 5
}
obj2 = {
  'over_due_data': 20,
  'text_data': 5
}
var obj ={}
Object.keys(obj1).forEach(function(a){
  obj[a] = obj1[a] +obj2[a]

})
console.log(obj)

Upvotes: 11

Bouraoui KACEM
Bouraoui KACEM

Reputation: 821

you can code it dynamically :

var resultObject={};
Object.keys(obj1).forEach(function(objectKey, index) {
    resultObject[objectKey]= obj1 [objectKey]+obj2[objectKey];

});

Upvotes: 0

Arthur
Arthur

Reputation: 5148

This question already have a lot of goods answers but I make a version who also handle multi-levels objects:

let sumAllKeys = (obj1, obj2) => Object.keys({...obj1, ...obj2}).reduce((acc, key) => {
  let key1 = obj1 && obj1[key] || 0;
  let key2 = obj2 && obj2[key] || 0;
  acc[key] = (typeof key1 == "object" || typeof key2 == "object")
    ? sumAllKeys(key1, key2)
    : (parseFloat(key1) || 0) + (parseFloat(key2) || 0);
  return acc;
}, {});


// Example: 

let a = {qwerty:1, azerty: {foo:2, bar:3}}
let b = {qwerty:5, azerty: {foo:4}, test:{yes:12, no:13}};
let c = {azerty: {bar:2}, test:{no:1}, another:{child:{subchild:3}}};

console.log("Sum of: ", {a,b,c});
console.log("Equal: ", [a, b, c].reduce(sumAllKeys, {}));

Upvotes: 0

Gangadhar Jannu
Gangadhar Jannu

Reputation: 4414

I have used below snippet to sum the two objects even if any of them has additional properties.

This solution is based on Array.prototype.reduce and short-circuit evaluation

Object.keys({ ...obj1, ...obj2 }).reduce((accumulator, currentValue) => {
    accumulator[currentValue] =
        (obj1[currentValue] || 0) + (obj2[currentValue] || 0);
    return accumulator;
}, {});

var obj1 = {
  'over_due_data': 10,
  'text_data': 5,
  'some_add_prop': 80
};

var obj2 = {
  'over_due_data': 20,
  'text_data': 5,
  'add_prop': 100
};


const sumOfObjs = Object.keys({ ...obj1,
  ...obj2
}).reduce((accumulator, currentValue) => {
  accumulator[currentValue] =
    (obj1[currentValue] || 0) + (obj2[currentValue] || 0);
  return accumulator;
}, {});

console.log(sumOfObjs);

Upvotes: 0

kind user
kind user

Reputation: 41893

Another possible solution, using Array#reduce.

var obj1 = {'over_due_data':10,'text_data':5}, obj2 = {'over_due_data':20,'text_data':5},
    obj = Object.keys(obj1).reduce(function(s,a) {
      s[a] = obj1[a] + obj2[a];
      return s;
    }, {})
    console.log(obj);

Upvotes: 4

Abi
Abi

Reputation: 734

Try this might be helpful

obj1 = {
  'over_due_data': 10,
  'text_data': 5
}
obj2 = {
  'over_due_data': 20,
  'text_data': 5
}
var obj ={}
Object.keys(obj1).map(function(a){
  obj[a] = obj1[a] +obj2[a]

})
console.log(obj)

Upvotes: -2

Özgür Ersil
Özgür Ersil

Reputation: 7013

Try something like this if you don't want to use loop

    obj1 = { 
      'over_due_data': 10,
      'text_data': 5
    } 
    
    obj2 = {
      'over_due_data': 20,
      'text_data': 5
    }
    var obj = {};
    obj['over_due_data'] = obj1['over_due_data'] + obj2['over_due_data']
    obj['text_data'] = obj1['text_data'] + obj2['text_data']

    console.log(obj)

Upvotes: 3

Related Questions