-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}
];
2
  • reduce is everything what you need Commented Jun 24, 2020 at 15:27
  • i know, but im trying to understand how to apply reduce Commented Jun 24, 2020 at 15:28

2 Answers 2

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)

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.