如何通过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
相关产品推荐
相关产品推荐

