-2

I need some help, I am trying to merge this objects by name property but I am stuck, I am trying to resolve this by array methods and not with for loops.

var arr = [
  {name: 'lucas', number: 20}, 
  {name: 'lucas', number: 22},
  {name: 'luna', number: 10}, 
  {name: 'luna', number: 23},
  {name: 'diego', number: 15}
];
          

var expectedOutput = [
  {name: 'lucas', number: 42},
  {name: 'luna', number: 33},
  {name: 'diego', number: 15}
];
Nick Parsons
  • 45,728
  • 6
  • 46
  • 64
sonEtLumiere
  • 4,461
  • 3
  • 8
  • 35

2 Answers2

1

You can make use of reduce and take Object.values in order to get the expected output. Here is the working example:

var arr = [{name: 'lucas', number: 20},  {name: 'lucas', number: 22}, {name: 'luna', number: 10} , {name: 'luna', number: 23}, {name: 'diego', number: 15}];

var result = Object.values(arr.reduce((acc, {name, number})=>{
   acc[name] = acc[name] || {name, number:0};
   acc[name].number+=number;
   return acc;
},{}));

console.log(result);
gorak
  • 5,233
  • 1
  • 7
  • 19
1

var arr = [{name:'lucas',number:20},{name:'lucas',number:22},{name:'luna',number:10},{name:'luna',number:23},{name:'diego',number:15}];

let finalResult = arr.reduce((result, obj) => {
  if (result[obj.name]) {
    result[obj.name].number += obj.number || 0
  } else {
    result[obj.name] = { ...obj};
  }
  return result
}, {})

finalResult = Object.values(finalResult)

console.log(finalResult)
Nithish
  • 5,393
  • 2
  • 9
  • 24