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

使用Lodash实现对象数组多层groupBy分组并对Sales聚合求和的问题

实现代码

你可以直接使用lodash的链式调用完成分组+求和+结构转换的全流程:

const _ = require('lodash')
const moment = require('moment')

// 原始数据
const rawData=[
  {
    Order_Date: "2020-08-11",
    Region: "South",
    Product_Name: "Bookcase",
    Sales: 261.96
  },
  {
    Order_Date: "2020-08-13",
    Region: "South",
    Product_Name: "Stacking Chairs",
    Sales: 731.94
  },
  {
    Order_Date: "2020-10-06",
    Region: "South",
    Product_Name: "Stacking Chairs",
    Sales: 700.45
  },
  {
    Order_Date: "2020-12-06",
    Region: "East",
    Product_Name: "Self-Adhesive Address Labels for Typewriters by Universal",
    Sales: 14.62
  },
  {
    Order_Date: "2019-11-15",
    Region: "East",
    Product_Name: "Table",
    Sales: 957
  },
  {
    Order_Date: "2019-11-10",
    Region: "East",
    Product_Name: "Eldon Fold",
    Sales: 22
  }
]

const result = _(rawData)
  // 第一层:按Region字段分组
  .groupBy('Region')
  // 遍历每个区域分组,组装成要求的输出结构
  .map((regionData, regionName) => {
    // 第二层:按年月分组
    const monthGroups = _.groupBy(regionData, item => moment(item.Order_Date).format('YYYY-MM'))
    // 对每个月的Sales求和,组装data数组
    const monthSales = _.map(monthGroups, (monthItems, monthStr) => ({
      Order_Date: monthStr,
      // 需要保留两位小数可改为 Number(_.sumBy(monthItems, 'Sales').toFixed(2))
      Sales: _.sumBy(monthItems, 'Sales')
    }))
    return {
      Region: regionName,
      data: monthSales
    }
  })
  .value()

console.log(result)

原有代码问题说明

  1. 仅完成了两层分组逻辑,没有对每个月份分组内的Sales字段做求和计算
  2. 没有将分组后的对象结构转换为要求的{Region: 区域名, data: 月度汇总数组}格式,_.forEach仅会修改原对象,不会返回新的结构。

优化提示

如果不想引入moment依赖,可以直接截取日期字符串的前7位获取年月,性能更高:

const monthGroups = _.groupBy(regionData, item => item.Order_Date.slice(0,7))

内容的提问来源于stack exchange,提问作者faisal-akbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:54:05