如何按日期对给定的示例数组进行数据汇总?
按日期汇总数组的实现方案
没问题!要按日期汇总你给出的数组里的数值字段,咱们可以用JavaScript的reduce()方法来实现——这是处理这类数据聚合需求最常用的方案之一,简单高效。
基础实现(针对固定字段)
如果你的数组里的数值字段固定是a、b、c、d,可以用下面的代码直接实现:
const originalArray = [ { y: "2019-01-10", a: 25, b: 40, c: 10, d: 0 }, { y: "2019-01-11", a: 25, b: 40, c: 10, d: 0 }, { y: "2019-01-10", a: 10, b: 10, c: 0, d: 0 } ]; // 用reduce做聚合,再转成数组 const summedArray = Object.values(originalArray.reduce((acc, current) => { // 以日期作为唯一标识,检查是否已存在汇总条目 if (!acc[current.y]) { // 不存在的话,复制当前对象作为初始汇总值 acc[current.y] = { ...current }; } else { // 存在的话,逐个累加数值字段 acc[current.y].a += current.a; acc[current.y].b += current.b; acc[current.y].c += current.c; acc[current.y].d += current.d; } return acc; }, {})); console.log(summedArray);
代码说明:
reduce()遍历原数组,acc是我们用来存储中间结果的累加器(初始值为空对象)- 对每个元素,先判断累加器里是否已有对应日期的条目
- 没有的话,用扩展运算符
...复制当前对象存入累加器(避免修改原数组的对象) - 有的话,把当前对象的
a、b、c、d字段分别加到已有条目的对应字段上 - 最后用
Object.values()把累加器的键值对转换成数组,得到最终的汇总结果
运行后输出的结果是:
[ { y: "2019-01-10", a: 35, b: 50, c: 10, d: 0 }, { y: "2019-01-11", a: 25, b: 40, c: 10, d: 0 } ]
通用实现(支持动态数值字段)
如果以后数组里可能新增其他数值字段(比如e、f),不想每次都手动修改累加逻辑,可以用更通用的写法:
const summedArray = Object.values(originalArray.reduce((acc, current) => { const date = current.y; if (!acc[date]) { acc[date] = { ...current }; } else { // 自动遍历所有字段,排除日期字段y,只累加数值类型的字段 Object.keys(current).forEach(key => { if (key !== 'y' && typeof current[key] === 'number') { acc[date][key] += current[key]; } }); } return acc; }, {}));
这个版本会自动识别所有非日期的数值字段并累加,扩展性更强。
内容的提问来源于stack exchange,提问作者Joel May
相关产品推荐
相关产品推荐

