Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript merge objects with same key and sum their values

The code is working fine as expected but the name parameter is missing in response.

var objArr= [{'location_id':1,'quantity':20,'name':'AB'},{'location_id':1,'quantity':20,'name':'AB'},{'location_id':3,'quantity':20,'name':'cd'}]

// first, convert data into a Map with reduce
let counts = objArr.reduce((prev, curr) => {
  let count = prev.get(curr.location_id) || 0;
  prev.set(curr.location_id, (curr.quantity + count),curr.name);
  return prev;
}, new Map());

// then, map your counts object back to an array
let reducedObjArr = [...counts].map(([location_id, quantity,name]) => {
  return {location_id, quantity,name}
})


console.log (reducedObjArr);

Expected Response:

[
{"location_id":1,"quantity":40, "name":'AB'},
{"location_id":3,"quantity":20, "name":'cd'}
]
like image 936
Taha Farooqui Avatar asked Jan 24 '23 22:01

Taha Farooqui


1 Answers

the simplest way:

const objArr = 
    [ { location_id: 1, quantity: 20, name: 'AB' } 
    , { location_id: 1, quantity: 20, name: 'AB' } 
    , { location_id: 3, quantity: 20, name: 'cd' } 
    ] 
     
const sum = objArr.reduce((a,c)=>{
  let x = a.find(e=>e.location_id===c.location_id)
  if(!x) a.push(Object.assign({},c))
  else  x.quantity += c.quantity
  return a
},[])

console.log(sum)
.as-console-wrapper { max-height: 100% !important; top: 0; }
like image 175
Mister Jojo Avatar answered Feb 14 '23 10:02

Mister Jojo