请问,这样的一个数组的对象中,累计求和怎么处理?

以下是数据源:

let arry = [
            { 
                height: 1, 
                status: 1, 
                itemList: [
                    {
                        packingNum :1,
                        sku:'001'
                    }
                    {
                        packingNum :3,
                        sku:'003'
                    }
                ]
            },
            { 
                height: 1, 
                status: 1, 
                itemList: [
                    {
                        packingNum :3,
                        sku:'001'
                    }
                ]
            },
            { 
                height: 1, 
                status: 1, 
                itemList: [
                    {
                        packingNum :4,
                        sku:'002'
                    }
                ]
            },
            
        ];

根据每一个itemList 中的sku的值,去找的其他对象中的有相同sku的 packingNum 进行相加(当前sku 的packingNum 不计算) ,将结果 otherPackingNum 添加道itemList 中

想要的结果是 这样的。

let arry = [
            { 
                height: 1, 
                itemList: [
                    {
                        packingNum: 1,
                        sku:'001',
                        otherPackingNum: 8
                    },
                    {
                        packingNum :3,
                        sku:'003',
                        otherPackingNum: 0
                    }
                ]
            },
            { 
                height: 1, 
                itemList: [
                    {
                        packingNum :3,
                        sku:'001',
                        otherPackingNum: 6
                    }
                ]
            },
            { 
                height: 1, 
                itemList: [
                    {
                        packingNum :5,
                        sku:'001',
                        otherPackingNum: 4
                    }
                ]
            },
            { 
                height: 1, 
                itemList: [
                    {
                        packingNum :4,
                        sku:'002',
                        otherPackingNum: 0
                    }
                ]
            },
            
        ];
阅读 1.7k
2 个回答

虽然可以遍历,对每一个 item 去统计 otherPackingNum,但是这样会做不少重复的统计工作。一般认为统计工作是比较消耗时间的,所以可以考虑只统计一次,如下

// 可以先用一个数组来保存所有 item 的引用
const items = arry.flatMap(({ itemList }) => itemList);
// 然后分组统计
const all = items.reduce((acc, { packingNum, sku }) => {
    acc[sku] ??= 0;
    acc[sku] += packingNum;
    return acc;
}, {});
// 再遍历一次,把 otherPackingNum 赋过去
items.forEach(it => it.otherPackingNum = all[it.sku] - it.packingNum);

// 因为 items 中是对象的引用,所以修改的也是 arry 中的引用对象,
// 直接打印 arry 就能看到结果
console.dir(arry, { depth: null });
arry.forEach((v,i,arr) => {
  v.itemList.forEach(o => {
    o.otherPackingNum = arr.reduce((res,e,j) => i!=j ? e.itemList.reduce((sum,it) => sum+(it.sku == o.sku ? it.packingNum : 0), res) : res, 0)
  })
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题