合并两个对象数组中指定 key 的值

如题,有两个对象数组,arr1 和 arr2

var arr1 = [
    {
      cid: 1,
      name: 'A',
      goods: [
        { gid: 11, gname: 'a', cid: 1, count: 1 },
        { gid: 12, gname: 'b', cid: 1 },
        { gid: 13, gname: 'c', cid: 1 }
      ]
    },
    {
      cid: 2,
      name: 'B',
      goods: [
        { gid: 14, gname: 'd', cid: 2, count: 2 }
      ]
    },
    {
      cid: 3,
      name: 'C',
      goods: []
    },
    {
      cid: 4,
      name: 'D',
      goods: []
    }
  ]
var arr2 = [
    { gid: 11, gname: 'a', cid: 1, count: 3 },
    { gid: 14, gname: 'd', cid: 2, count: 1 }
  ]

想把相同 gid 中的 count 进行累加,形成一个新的数组,最终得到如下效果:
(PS:arr 中的 gid 一定是 arr1 已有的,因此不用考虑往空 goods 数组中插入对象的情况)

var arr3 = [
    {
      cid: 1,
      name: 'A',
      goods: [
        { gid: 11, gname: 'a', cid: 1, count: 4 },
        { gid: 12, gname: 'b', cid: 1 },
        { gid: 13, gname: 'c', cid: 1 }
      ]
    },
    {
      cid: 2,
      name: 'B',
      goods: [
        { gid: 14, gname: 'd', cid: 2, count: 3 }
      ]
    },
    {
      cid: 3,
      name: 'C',
      goods: []
    },
    {
      cid: 4,
      name: 'D',
      goods: []
    }
  ]
阅读 4k
2 个回答
let getMap = (arr, key) => arr.map(a => a[key]);

let cidMap = getMap(arr1, 'cid');

arr2.forEach(item => {
      let goods = arr1[cidMap.indexOf(item['cid'])]['goods'];
      let goodsMap = getMap(goods, 'gid');
      // 手机码字,忘了 goods 的操作会不会影响原来的数组……
      // 题主自行试一下吧
      arr1[cidMap.indexOf(item['cid'])]['goods']
             [goodsMap.indexOf(item['gid'])]
             ['count'] += item['count'];
});
 arr1.forEach(a=>{
        a.goods=a.goods.map(v=>{
            var index=arr2.findIndex(c=>c.gid===v.gid)
            if(index>=0){
                v.count+=arr2[index].count
            }
            return !v.count?{gid:v.gid,gname:v.gname}:{gid:v.gid,gname:v.gname,count:v.count}
        })
    })
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题