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

如何通过group by实现JavaScript数组多字段聚合求和

分组求和问题修正

问题背景

我有一份5万+条记录的数据集,需要按coaGrpCode和ldgrGrp字段分组,对每组的opening、prdDr、prdCr、closing字段分别求和。目前用reduce写的代码只实现了opening字段的求和,需要修正代码完成多字段求和。

数据示例

[
    {
        "siteCode": "ANKL",
        "ldgrGrp": "G00",
        "coaGrpId": 355,
        "coaPrntGrpId": 0,
        "coaGrpNm": "Current Liabilities",
        "coaGrpCode": "CL",
        "coaLedger": "Current Liabilities",
        "prntSeq": 3,
        "pL_Item": 0,
        "opening": -4851148.45,
        "prdDr": 0,
        "prdCr": 0,
        "closing": -4851148.45
    },
    // 其余数据省略
]

期望输出格式

[
    {
        "ldgrGrp": "G00",
        "coaGrpCode": "CL",
        "coaLedger": "Current Liabilities",       
        "opening": Sum of Opening,
        "prdDr": Sum of prdDr,
        "prdCr": Sum of prdCr,
        "closing": Sum of Closing
    },
    // 其余输出省略
]

现有代码

function filterData() {               
        var r = Tridata.reduce(function (pv, cv) {
            if (pv[cv.coaGrpCode]) {
                pv[cv.coaGrpCode] += cv.opening;
            } else {
                pv[cv.coaGrpCode] = cv.opening;
                
            }
            return pv;
        }, []);

        console.log(r)
    }

修正后的代码及说明

原代码存在三个核心问题:仅按单字段分组、只累加单个数值字段、初始值选择不当。修正后的代码如下:

function filterData() {
    // 用对象存储分组结果,键为coaGrpCode+ldgrGrp的组合唯一标识
    const grouped = Tridata.reduce((pv, cv) => {
        const groupKey = `${cv.coaGrpCode}_${cv.ldgrGrp}`;
        
        if (!pv[groupKey]) {
            // 首次遇到该分组,初始化结构并保留非求和字段
            pv[groupKey] = {
                ldgrGrp: cv.ldgrGrp,
                coaGrpCode: cv.coaGrpCode,
                coaLedger: cv.coaLedger,
                opening: 0,
                prdDr: 0,
                prdCr: 0,
                closing: 0
            };
        }
        
        // 对四个数值字段分别累加
        pv[groupKey].opening += cv.opening;
        pv[groupKey].prdDr += cv.prdDr;
        pv[groupKey].prdCr += cv.prdCr;
        pv[groupKey].closing += cv.closing;
        
        return pv;
    }, {});
    
    // 将对象的值转为数组,匹配期望输出格式
    const result = Object.values(grouped);
    console.log(result);
    return result;
}

关键调整点

  • 用coaGrpCode和ldgrGrp拼接成唯一分组键,确保分组逻辑准确
  • 初始化分组对象时保留输出所需的非求和字段
  • 对四个目标数值字段分别执行累加操作
  • 最终通过Object.values()将分组对象转为数组,符合期望输出结构

内容的提问来源于stack exchange,提问作者user14418741

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:05:23