developer
developer

Reputation: 1675

Merge array elements group by properties in Javascript

I have the following javascript object array:

       [ { "firstName": "x", "lastName": "y", "age": 10}, 
         { "firstName": "x", "lastName": "y", "height": 100},
         { "firstName": "x", "lastName": "y", "weight": 50},
         { "firstName": "a", "lastName": "b", "age": 11}, 
         { "firstName": "a", "lastName": "b", "height": 110},
         { "firstName": "a", "lastName": "b", "weight": 60},
         { "firstName": "m", "lastName": "n", "age": 12}, 
         { "firstName": "m", "lastName": "n", "height": 120},
         { "firstName": "m", "lastName": "n", "weight": 70}]

Is it possible to group by firstName and lastName such that it includes other properties of the object in the array?

Expected Array:

       [ { "firstName": "x", "lastName": "y", "age": 10, "height": 100, "weight": 50}, 
         { "firstName": "a", "lastName": "b", "age": 11, "height": 110, "weight": 60},
         { "firstName": "m", "lastName": "n", "age": 12, "height": 120, "weight": 70}]

Upvotes: 1

Views: 74

Answers (2)

holydragon
holydragon

Reputation: 6728

Concept

Prepare a result array. Iterate through all the data. Check if the firstName and lastName exist in the result array. If no, push it into the result array. If yes, merge the object to get the missing properties.

Code

const data =[ { "firstName": "x", "lastName": "y", "age": 10}, 
         { "firstName": "x", "lastName": "y", "height": 100},
         { "firstName": "x", "lastName": "y", "weight": 50},
         { "firstName": "a", "lastName": "b", "age": 11}, 
         { "firstName": "a", "lastName": "b", "height": 110},
         { "firstName": "a", "lastName": "b", "weight": 60},
         { "firstName": "m", "lastName": "n", "age": 12}, 
         { "firstName": "m", "lastName": "n", "height": 120},
         { "firstName": "m", "lastName": "n", "weight": 70}];
let result = [];
let found;
data.forEach(d => {
  found = false;
  result.forEach(r => {
    if (r.firstName === d.firstName && r.lastName === d.lastName){
      Object.assign(r, d);
      found = true;
    }
  });
  if (!found){
    result.push(d);
  }
});
console.log(result);

Upvotes: 2

R4ncid
R4ncid

Reputation: 7129

you can do something like this

const group = data => Object.values(data.reduce((res, {firstName, lastName, ...rest}) =>{
  const key = JSON.stringify({firstName, lastName})
  
  return {
    ...res,
    [key]: {firstName, lastName, ...(res[key] || {}), ...rest}
  }
}, {}))



const data = [ { "firstName": "x", "lastName": "y", "age": 10}, 
         { "firstName": "x", "lastName": "y", "height": 100},
         { "firstName": "x", "lastName": "y", "weight": 50},
         { "firstName": "a", "lastName": "b", "age": 11}, 
         { "firstName": "a", "lastName": "b", "height": 110},
         { "firstName": "a", "lastName": "b", "weight": 60},
         { "firstName": "m", "lastName": "n", "age": 12}, 
         { "firstName": "m", "lastName": "n", "height": 120},
         { "firstName": "m", "lastName": "n", "weight": 70}]
         
console.log(group(data))

Upvotes: 1

Related Questions