JavaScript中如何对对象数组做Pivot处理并按GroupBy分组求和剩余属性
优化实现方案
核心思路
原实现对数组进行了2次遍历(步骤1的for循环+分组求和内部的reduce),优化方案通过单次reduce遍历同时完成pivot映射和分组求和操作,减少冗余遍历,逻辑更聚合。
实现代码
const arr = [ { "product": "Jam", "calorie": 2000, "A": 300, "B": 500, "type": "Daily" }, { "product": "Sugar", "calorie": 1000, "A": 100, "B": 200, "type": "Daily" } ] // 可根据业务需求灵活调整配置 const RULE_CONFIG = { pivot: { keyField: 'product', valueField: 'calorie' }, groupKeys: ['type'], sumKeys: ['A', 'B'] } const result = arr.reduce((acc, curr) => { // 处理Pivot逻辑 acc[curr[RULE_CONFIG.pivot.keyField]] = curr[RULE_CONFIG.pivot.valueField] // 处理分组求和逻辑(你场景最终输出单个对象,说明分组后仅1组,可直接判断是否完成初始化) if (!acc.__groupInited) { RULE_CONFIG.groupKeys.forEach(key => acc[key] = curr[key]) RULE_CONFIG.sumKeys.forEach(key => acc[key] = 0) acc.__groupInited = true } RULE_CONFIG.sumKeys.forEach(key => acc[key] += curr[key]) // 删除临时标记字段 delete acc.__groupInited return acc }, {}) console.log(result) // 输出结果和原代码完全一致:{ Jam: 2000, Sugar: 1000, type: 'Daily', A: 400, B: 700 }
方案优势
- 时间复杂度从O(2n)降低到O(n),数据量级越大性能提升越明显
- 无需维护多余的中间变量a1、a2,也不需要单独引入外部分组求和函数,代码更精简
- 配置化实现规则,后续调整pivot逻辑、分组字段、求和字段都只需要修改RULE_CONFIG即可,扩展性更强
如果需要保留通用多分组支持,只需要调整分组判断逻辑,和你原有groupAndSum的分组逻辑保持一致即可。
内容的提问来源于stack exchange,提问作者Jeery sum code
相关产品推荐
相关产品推荐

