You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:36:25