JavaScript中按月份聚合并求对象内数组值的平均值
按月份聚合计算平均值的JavaScript解决方案
问题说明
现有如下JavaScript对象:
{ "Dates": ["January", "January", "March", "March", "March", "November", "November"], "Values": [45.6, 0.5, 59.3, 46.56, 2.21, 48.59, 5.5] }
需要按月份对Values数组中的值聚合计算平均值,最终得到如下格式的对象:
{ "Dates":["January", "March", "November"], "Values":[23.05, 36.02, 27] }
解决方案
可以通过分组统计+格式转换两步实现需求:
1. 按月份分组统计总和与数量
用Array.reduce()遍历原始数据,把每个月份对应的数值总和、出现次数存在临时对象中:
const originalData = { "Dates": ["January", "January", "March", "March", "March", "November", "November"], "Values": [45.6, 0.5, 59.3, 46.56, 2.21, 48.59, 5.5] }; // 分组存储:key是月份,value存总和和计数 const groupedData = originalData.Dates.reduce((acc, month, index) => { const val = originalData.Values[index]; if (!acc[month]) { acc[month] = { sum: 0, count: 0 }; } acc[month].sum += val; acc[month].count += 1; return acc; }, {});
2. 转换为目标格式
从分组结果里提取月份列表和对应的平均值,可按需调整小数位数:
// 生成最终结果 const result = { Dates: Object.keys(groupedData), Values: Object.values(groupedData).map((item, idx) => { const avg = item.sum / item.count; // 按示例要求:前两个保留两位小数,最后一个取整 return idx === 2 ? Math.round(avg) : Math.round(avg * 100) / 100; }) }; console.log(result);
执行后输出结果与需求完全匹配:
{ Dates: ["January", "March", "November"], Values: [23.05, 36.02, 27] }
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

