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

如何按日期对给定的示例数组进行数据汇总?

按日期汇总数组的实现方案

没问题!要按日期汇总你给出的数组里的数值字段,咱们可以用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:54:57