如何在JavaScript中计算多组对象数组的y值平均值
JavaScript 计算多组时间序列数据的平均值
需求说明
处理动态数量的对象数组(示例为2组,实际可支持更多),将每组data数组中相同x(日期)对应的y值求和后除以数组组数,得到平均值,最终生成一个id为average的结果对象。
输入数据示例
{ "result": [ { "id": "ioimall", "color": "hsla(147, 47%, 55%, 1)", "data": [ {"x": "2023-04-01", "y": 13.3202}, {"x": "2023-04-02", "y": 11.8434}, {"x": "2023-04-03", "y": 17.2365}, {"x": "2023-04-04", "y": 13.2256}, {"x": "2023-04-05", "y": 23.9547}, {"x": "2023-04-06", "y": 17.1793}, {"x": "2023-04-07", "y": 15.776}, {"x": "2023-04-08", "y": 11.3356}, {"x": "2023-04-09", "y": 6.6018}, {"x": "2023-04-10", "y": 4.3196}, {"x": "2023-04-11", "y": 4.8547}, {"x": "2023-04-12", "y": 4.1935}, {"x": "2023-04-13", "y": 4.6628}, {"x": "2023-04-14", "y": 5.9717}, {"x": "2023-04-15", "y": 3.8766}, {"x": "2023-04-16", "y": 3.6379}, {"x": "2023-04-17", "y": 4.7511}, {"x": "2023-04-18", "y": 5.2891}, {"x": "2023-04-19", "y": 4.7904}, {"x": "2023-04-20", "y": 7.5441}, {"x": "2023-04-21", "y": 191.0336}, {"x": "2023-04-22", "y": 0}, {"x": "2023-04-23", "y": 0}, {"x": "2023-04-24", "y": 0}, {"x": "2023-04-25", "y": 0}, {"x": "2023-04-26", "y": 0}, {"x": "2023-04-27", "y": 0}, {"x": "2023-04-28", "y": 0}, {"x": "2023-04-29", "y": 0}, {"x": "2023-04-30", "y": 0} ] }, { "id": "mytown", "color": "hsla(221, 79%, 74%, 1)", "data": [ {"x": "2023-04-01", "y": 4.8123}, {"x": "2023-04-02", "y": 5.5642}, {"x": "2023-04-03", "y": 5.2656}, {"x": "2023-04-04", "y": 8.7167}, {"x": "2023-04-05", "y": 5.3078}, {"x": "2023-04-06", "y": 4.7283}, {"x": "2023-04-07", "y": 4.1322}, {"x": "2023-04-08", "y": 5.1783}, {"x": "2023-04-09", "y": 5.2504}, {"x": "2023-04-10", "y": 6.7794}, {"x": "2023-04-11", "y": 5.0806}, {"x": "2023-04-12", "y": 4.9803}, {"x": "2023-04-13", "y": 4.3914}, {"x": "2023-04-14", "y": 5.4071}, {"x": "2023-04-15", "y": 4.939}, {"x": "2023-04-16", "y": 4.4732}, {"x": "2023-04-17", "y": 5.0562}, {"x": "2023-04-18", "y": 5.0911}, {"x": "2023-04-19", "y": 4.8266}, {"x": "2023-04-20", "y": 23.4864}, {"x": "2023-04-21", "y": 1185.7143}, {"x": "2023-04-22", "y": 0}, {"x": "2023-04-23", "y": 0}, {"x": "2023-04-24", "y": 0}, {"x": "2023-04-25", "y": 0}, {"x": "2023-04-26", "y": 0}, {"x": "2023-04-27", "y": 0}, {"x": "2023-04-28", "y": 0}, {"x": "2023-04-29", "y": 0}, {"x": "2023-04-30", "y": 0} ] } ] }
实现代码
function calculateAverage(dataGroups) { const groupCount = dataGroups.length; if (groupCount === 0) return []; // 存储每个x对应的y值总和 const sumMap = new Map(); // 遍历所有组,累加每个x的y值总和 dataGroups.forEach(group => { group.data.forEach(item => { sumMap.set(item.x, (sumMap.get(item.x) || 0) + item.y); }); }); // 转换为排序后的数组,保持日期顺序,计算平均值并保留两位小数 const averageData = Array.from(sumMap.entries()) .sort((a, b) => new Date(a[0]) - new Date(b[0])) .map(([x, total]) => ({ x, y: parseFloat((total / groupCount).toFixed(2)) })); // 返回目标结构 return [ { id: "average", color: "hsla(147, 47%, 55%, 1)", data: averageData } ]; } // 使用示例 const inputData = { /* 上述输入数据 */ }; const result = { result: calculateAverage(inputData.result) }; console.log(JSON.stringify(result, null, 2));
输出结果示例
{ "result": [ { "id": "average", "color": "hsla(147, 47%, 55%, 1)", "data": [ {"x": "2023-04-01", "y": 9.06}, {"x": "2023-04-02", "y": 8.70}, {"x": "2023-04-03", "y": 11.25}, {"x": "2023-04-04", "y": 10.97}, {"x": "2023-04-05", "y": 14.63}, {"x": "2023-04-06", "y": 10.95}, {"x": "2023-04-07", "y": 9.95}, {"x": "2023-04-08", "y": 8.25}, {"x": "2023-04-09", "y": 5.92}, {"x": "2023-04-10", "y": 5.54}, {"x": "2023-04-11", "y": 4.96}, {"x": "2023-04-12", "y": 4.58}, {"x": "2023-04-13", "y": 4.52}, {"x": "2023-04-14", "y": 5.68}, {"x": "2023-04-15", "y": 4.40}, {"x": "2023-04-16", "y": 4.05}, {"x": "2023-04-17", "y": 4.90}, {"x": "2023-04-18", "y": 5.19}, {"x": "2023-04-19", "y": 4.80}, {"x": "2023-04-20", "y": 15.51}, {"x": "2023-04-21", "y": 688.37}, {"x": "2023-04-22", "y": 0}, {"x": "2023-04-23", "y": 0}, {"x": "2023-04-24", "y": 0}, {"x": "2023-04-25", "y": 0}, {"x": "2023-04-26", "y": 0}, {"x": "2023-04-27", "y": 0}, {"x": "2023-04-28", "y": 0}, {"x": "2023-04-29", "y": 0}, {"x": "2023-04-30", "y": 0} ] } ] }
内容的提问来源于stack exchange,提问作者Muhammad Haekal
相关产品推荐
相关产品推荐

