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
相关产品推荐
相关产品推荐

