JavaScript如何对对象数组按字段分组并实现数值求和
JSON数据按字段分组求和实现方案
核心处理逻辑分为3步:
- 以
printingMaterialCode作为唯一分组键,遍历原始数据集做聚合 - 对每个分组累计总印量
printingQuantity:所有条目该字段值直接累加 - 对每个分组累计审核通过量
approvedQuantity:仅当条目存在approved: true标记时,才将该条目的printingQuantity计入通过量,无通过量的分组最终不返回该字段,匹配预期输出格式。
JavaScript 实现(适配前端/Node.js环境)
const rawData = [ { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0003" }, "printingMaterialCode": "400000033", "printingQuantity": 400, "approved": true }, { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0002" }, "printingMaterialCode": "400000033", "printingQuantity": 600, "campaignId": "DATAS00002" }, { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0001" }, "printingMaterialCode": "400000034", "printingQuantity": 300, "campaignId": "DATAS00002" } ]; const groupMap = {}; for (const item of rawData) { const materialCode = item.printingMaterialCode; // 初始化分组 if (!groupMap[materialCode]) { groupMap[materialCode] = { printingMaterialCode: materialCode, printingQuantity: 0, approvedQuantity: 0 }; } // 累加总印量 groupMap[materialCode].printingQuantity += item.printingQuantity; // 累加审核通过量 if (item.approved === true) { groupMap[materialCode].approvedQuantity += item.printingQuantity; } } // 转换为目标数组结构,移除值为0的approvedQuantity字段 const result = Object.values(groupMap).map(groupItem => { if (groupItem.approvedQuantity === 0) { delete groupItem.approvedQuantity; } return groupItem; });
执行上述代码后得到的输出和预期完全一致:
[ { "printingMaterialCode": "400000033", "printingQuantity": 1000, "approvedQuantity": 400 }, { "printingMaterialCode": "400000034", "printingQuantity": 300 } ]
Python 实现(适配服务端处理场景)
如果需要在Python服务端完成聚合,可以使用如下逻辑:
raw_data = [ { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0003" }, "printingMaterialCode": "400000033", "printingQuantity": 400, "approved": True }, { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0002" }, "printingMaterialCode": "400000033", "printingQuantity": 600, "campaignId": "DATAS00002" }, { "siteDetails": { "printerCode": "660103684", "siteId": "UTT212303-STB-2040-0001" }, "printingMaterialCode": "400000034", "printingQuantity": 300, "campaignId": "DATAS00002" } ] group_map = {} for item in raw_data: code = item["printingMaterialCode"] if code not in group_map: group_map[code] = { "printingMaterialCode": code, "printingQuantity": 0, "approvedQuantity": 0 } group_map[code]["printingQuantity"] += item["printingQuantity"] if item.get("approved") is True: group_map[code]["approvedQuantity"] += item["printingQuantity"] result = [] for group in group_map.values(): if group["approvedQuantity"] == 0: group.pop("approvedQuantity") result.append(group)
内容的提问来源于stack exchange,提问作者Atul Kumar
相关产品推荐
相关产品推荐

