繁体   English   中英

JavaScript 合并具有相同键的对象并将它们的值相加

[英]JavaScript merge objects with same key and sum their values

代码按预期工作正常,但响应中缺少name参数。

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

预期反应:

[
{"location_id":1,"quantity":40, "name":'AB'},
{"location_id":3,"quantity":20, "name":'cd'}
]

最简单的方法:

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

您可以通过解决较小的问题和设计可重用的函数来解决这个问题。

第一组相关对象

从:

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

至:

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

然后合并每个集合

从:

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

至:

[ { location_id:1, quantity:40, name:'AB' }
, { location_id:3, quantity:20, name:'cd' }
]

 const group_name = group_by('name'); const sum_quantity = merge_key_with('quantity', (a, b) => a + b); const answer = Object.values(group_name(data)).map(sum_quantity); console.log(answer);
 <script> const data = [ { location_id:1, quantity:20, name:'AB' }, { location_id:1, quantity:20, name:'AB' }, { location_id:3, quantity:20, name:'cd' } ]; const group_by = k => xs => xs.reduce ( (acc, x) => ( acc[x[k]]? acc[x[k]].push(x): acc[x[k]] = [x], acc ), {} ); const merge_key_with = (k, fn) => xs => xs.slice(1).reduce ( (acc, o) => ( acc[k] = fn(acc[k], o[k]), acc ), {...xs[0]} ); </script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM