Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merge two javascript objects adding values of common properties

I have two or more javascript objects. I want to merge them adding values of common properties and then sort them in descending order of values.

e.g.

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}

var c = merge(a,b)

c should then be like this:

c = {
fr: 24,
en: 13,
in:9,
br:8
} 

i.e. both objects are merge, values of common keys are added and then keys are sorted.

Here's what I've tried:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
c = {}

// copy common values and all values of a to c
for(var k in a){
  if(typeof b[k] != 'undefined'){  
    c[k] = a[k] + b[k]  
  }
  else{ c[k] = a[k]}
}

// copy remaining values of b (which were not common)
for(var k in b){
 if(typeof c[k]== 'undefined'){
  c[k] = b[k]
 }
} 

// Create a object array for sorting
var arr = [];

for(var k in c){
 arr.push({lang:k,count:c[k]})
}

// Sort object array
arr.sort(function(a, b) {
   return b.count - a.count;
})

but I dont think its good. So many loops :( It would be nice if someone can provide a less messy and good code.

like image 928
Jashwant Avatar asked Feb 07 '12 10:02

Jashwant


People also ask

How to merge properties of JavaScript objects dynamically?

There are two methods to merge properties of javascript objects dynamically. They are The Object.assign () method is used to copy the values of all properties from one or more source objects to a target object. It will return the target object.

How to merge two objects into one?

To merge objects into a new one that has all properties of the merged objects, you have two options: Use a spread operator (...) Use the Object.assign () method Merge objects using the spread operator (...)

How to recursively merge objects in JavaScript?

To recursively merge own and inherited enumerable string keyed properties of source objects to a target object, you can use the Lodash ._merge () method: In this tutorial, you have learned how to merge objects in JavaScript using the spread operator ( ...) and Object.assign () method.

What is object merging in JavaScript?

In JavaScript, an object is defined as a collection of key-value pairs. An object is also a non-primitive data type. You'll oftentimes need to combine objects into a single one which contains all the individual properties of its constituent parts. This operation is called merging.


Video Answer


1 Answers

In ES2015+, object properties are ordered (first by ascending numeric keys, then by insertion order for non-numeric keys). This is guaranteed by the specification if you use one of the methods for which iteration order is specified (like Object.getOwnPropertyNames).

In ES2020+, the methods for which enumeration order used to be unspecified are now specified (though environments have been following it for ages anyway).

But you have to be sure that none of the properties are numeric (otherwise, they'll come first, before non-numeric properties, no matter the insertion order).

Use reduce to iterate over each object and create or add to the same property on the accumulator. Then, sort the object's entries, and use Object.fromEntries to transform it into an object with sorted properties. No need for jQuery:

var a = {en : 5,fr: 3,in: 9}
var b = {en: 8,fr: 21,br: 8}
console.log(merge(a, b));

function merge(...objects) {
  const merged = objects.reduce((a, obj) => {
    Object.entries(obj).forEach(([key, val]) => {
      a[key] = (a[key] || 0) + val;
    });
    return a;
  }, {});
  return Object.fromEntries(
    Object.entries(merged).sort(
      (a, b) => b[1] - a[1]
    )
  );
}
like image 199
CertainPerformance Avatar answered Sep 18 '22 15:09

CertainPerformance