使用Array.reduce()按多字段对数组分组并计算指标总和的技术咨询
实现代码
const output = Object.values( input.reduce((acc, current) => { const { date, source, metrics: { conversions } } = current; // 初始化当前日期的分组项 if (!acc[date]) { acc[date] = { date }; } // 累加对应来源的转化数 acc[date][source] = (acc[date][source] || 0) + conversions; return acc; }, {}) );
逻辑说明
- 采用
reduce先构建以日期为键的临时映射对象,相比原实现中每次遍历数组查找日期项的方式,时间复杂度从O(n²)优化为O(n) - 遍历每一项时解构出所需的日期、来源、转化数字段
- 若当前日期不存在于映射对象中,先初始化仅携带date属性的分组项
- 对应来源的转化数累加,若该来源字段未初始化则先赋值为0再相加
- 最终通过
Object.values提取映射对象的所有值,即可得到目标格式的输出数组
原代码问题说明
你原有代码仅完成了日期去重,没有处理来源字段的转化数累加逻辑,且每次遍历都要全量映射数组去重来源、过滤数组替换日期项,存在大量不必要的性能开销。
内容的提问来源于stack exchange,提问作者Ilya Kamovich
相关产品推荐
相关产品推荐

