使用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)
原有代码问题说明
- 仅完成了两层分组逻辑,没有对每个月份分组内的Sales字段做求和计算
- 没有将分组后的对象结构转换为要求的
{Region: 区域名, data: 月度汇总数组}格式,_.forEach仅会修改原对象,不会返回新的结构。
优化提示
如果不想引入moment依赖,可以直接截取日期字符串的前7位获取年月,性能更高:
const monthGroups = _.groupBy(regionData, item => item.Order_Date.slice(0,7))
内容的提问来源于stack exchange,提问作者faisal-akbar
相关产品推荐
相关产品推荐

