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

JavaScript按日期计算JSON数组的求和与累积平均值

解决方案:按日期求和与计算累积平均值

没问题,我来帮你搞定这个需求!下面是用JavaScript实现的完整方案,完全符合你的预期输出:

原始数据

首先是你提供的原始数组:

var b = [ 
  {Date:'Jan 2016', steel:10.98}, 
  {Date:'Feb 2016', steel:5.67}, 
  {Date:'Jan 2016', steel:3.14}, 
  {Date:'Feb 2016', steel:2.14}, 
  {Date:'Mar 2016', steel:12.14} 
];

步骤1:按日期计算steel的求和值

我们可以用reduce方法分组累加相同日期的steel值:

// 按日期分组求和
const sumByDate = Object.values(b.reduce((acc, item) => {
  // 如果当前日期还没在累加对象里,初始化一个条目
  if (!acc[item.Date]) {
    acc[item.Date] = { Date: item.Date, val: 0 };
  }
  // 累加steel值
  acc[item.Date].val += item.steel;
  return acc;
}, {}));

执行这段代码后,sumByDate就是你要的求和结果:

[
  {"Date": "Jan 2016","val": 14.12},
  {"Date": "Feb 2016","val": 7.81},
  {"Date": "Mar 2016","val": 12.14}
]

步骤2:计算累积平均值

累积平均值需要计算到当前日期为止所有原始数据的平均值,这里要注意先确保日期顺序正确(避免原始数组日期乱序的问题):

// 定义日期顺序,保证计算时的顺序是Jan→Feb→Mar
const dateOrder = ['Jan 2016', 'Feb 2016', 'Mar 2016'];
// 先给求和后的数组按日期排序
sumByDate.sort((a, b) => dateOrder.indexOf(a.Date) - dateOrder.indexOf(b.Date));

// 计算累积平均值
const cumulativeAvg = sumByDate.reduce((acc, item, index) => {
  // 筛选出当前日期及之前的所有原始数据
  const allItemsUpToNow = b.filter(i => dateOrder.indexOf(i.Date) <= index);
  // 计算总求和
  const totalSum = allItemsUpToNow.reduce((sum, i) => sum + i.steel, 0);
  // 计算平均值并保留两位小数
  const avg = totalSum / allItemsUpToNow.length;
  acc.push({ Date: item.Date, val: avg.toFixed(2) });
  return acc;
}, []);

最终的累积平均结果如下(和你示例中的Jan 2016结果完全匹配):

[
  {"Date": "Jan 2016","val": "7.06"},
  {"Date": "Feb 2016","val": "5.48"},
  {"Date": "Mar 2016","val": "6.81"}
]

说明

  • 分组求和的核心是用对象做累加容器,键为日期,值为对应的累加结果,最后转成数组得到结构化输出。
  • 累积平均时先固定日期顺序,避免原始数组日期乱序导致计算错误,然后每次取到当前日期的所有数据计算平均,确保结果准确。

内容的提问来源于stack exchange,提问作者user9664067

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:41:31