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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:36:04