求指导:计算对象数组中指标的DoD滚动增量并转换数据结构
解决方案:转换数据结构并计算日环比
你的需求是将包含日期、维度和度量的数组,转换为每个度量值以[当前值, 日环比绝对值, 日环比百分比]形式存储的结构,下面是基于Lodash的简洁实现方案:
问题分析
你最初的代码存在两个核心问题:
_.groupBy调用方式错误:链式调用中_.groupBy不需要重复传入data参数,正确写法是_.groupBy(item => ...)- 逻辑拆分不合理:按度量分别处理的方式无法将结果关联回原始的日期、维度结构,导致后续无法生成预期的输出格式
完整实现代码
const _ = require('lodash'); const dimensionList = ["city","category"]; const measureList = ["order","buyer","gmv"]; // 1. 按维度组合分组,并按日期排序每个分组(确保时间顺序正确) const groupedByDimensions = _.chain(data) .groupBy(item => dimensionList.map(dim => item[dim]).join('-')) .mapValues(group => _.sortBy(group, 'day')) .value(); // 2. 遍历分组计算日环比,转换为目标结构 const transformedData = _.flatMap(groupedByDimensions, group => { return group.map((currentItem, index) => { const prevItem = index > 0 ? group[index - 1] : null; const newItem = {...currentItem}; measureList.forEach(measure => { const currentVal = currentItem[measure]; if (!prevItem) { // 首个日期无环比数据,填充null newItem[measure] = [currentVal, null, null]; } else { const prevVal = prevItem[measure]; const diffAbsolute = currentVal - prevVal; // 避免除以0,若前值为0则百分比设为null const diffPercent = prevVal !== 0 ? diffAbsolute / prevVal : null; newItem[measure] = [currentVal, diffAbsolute, diffPercent]; } }); return newItem; }); });
代码说明
- 分组与排序:先按
dimensionList的维度组合分组,再对每个分组按日期升序排序,确保后续计算日环比时是严格按时间顺序进行的 - 日环比计算:
- 对每个分组内的元素,通过索引判断是否存在前一天的数据
- 对每个度量,计算绝对值差值和百分比差值,同时处理前一天值为0的边界情况
- 结构转换:将每个度量的原始值替换为包含当前值、环比绝对值、环比百分比的数组,最终通过
flatMap将分组数据展开为一维数组,还原原始数据的整体结构
测试验证
用你提供的示例数据运行代码后,会得到完全符合预期的输出结果:
- 2024-01-01的所有度量值数组后两位为
null - 2024-01-02的
order值为[125,25,0.25],buyer为[60,10,0.2],gmv为[1400,400,0.4],与预期一致
内容的提问来源于stack exchange,提问作者Lukest_Dang
相关产品推荐
相关产品推荐

