数组有些相同的ID与数量不同的情况下如何能叠加合并?

let badge = [{id: 323, badge: 10},{id: 323, badge: 10},{id: 311, badge: 1},{id: 311, badge: 1},{id: 311, badge: 1},{id: 311, badge: 1},{id: 352, badge: 3},{id: 352, badge: 100},{id: 480, badge: 5}]

//怎么叠加 参考这个计算结果
let badgeMerge = [{id: 323, badge: 20},{id: 311, badge: 4},{id: 352, badge: 103},{id: 480, badge: 5}]

这个数组有些相同的ID与数量不同的情况下如何能叠加合并?

阅读 3.6k
3 个回答
  let keys = Array.from(new Set(badge.map(item => item.id)))
  var badgeMerge = keys.map(key => {
    return {
      id: key,
      badge: badge.filter(item => item.id == key).reduce((pre, cur) => pre+cur.badge, 0)
    }
  })
  • 如果数组元素是有序且连续的,使用 Array.prototype.reduce 就好,当每次 id 相同时,合并元素但不记录结果,当每次 id 不相同时,记录结果
  • 如果数组元素是无序且非连续的,可以先按 id 分组,之后每个组分别使用 Array.prototype.reduce 生成一个结果元素,当然也可以先按 id 排序,再使用第一种方法
Object.values(badge.reduce((t,c)=>{
    (!t[c.id] && (t[c.id]= c)) || (t[c.id] && (t[c.id].badge += c.badge));
    return t;
}, {}));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题