如何对含可变属性的对象数组按组计算平均值?
分组计算对象数组的属性平均值
实现思路
- 按指定的
groupBy数量将数组分割为若干子组 - 对每个子组,遍历所有非
time属性,累加属性值总和 - 用总和除以组内元素数量得到平均值,最终整理为包含
time(取组内第一个元素的time)和各属性平均值的对象
代码实现
function groupAndAverage(arr, groupBy) { const result = []; // 按groupBy步长遍历数组,分割分组 for (let i = 0; i < arr.length; i += groupBy) { const group = arr.slice(i, i + groupBy); const groupSize = group.length; // 初始化分组结果,保留组内第一个元素的time const avgObj = { time: group[0].time }; // 存储各属性的累加总和 const propertySums = {}; // 遍历组内每个对象,累加属性值 group.forEach(item => { Object.keys(item).forEach(key => { if (key === 'time') return; // 跳过time属性 // 初始化总和为0(如果属性首次出现) if (!propertySums.hasOwnProperty(key)) { propertySums[key] = 0; } // 累加值,若对象无该属性则视为0 propertySums[key] += item[key] || 0; }); }); // 计算平均值并添加到结果对象 Object.keys(propertySums).forEach(key => { avgObj[key] = propertySums[key] / groupSize; // 如需保留小数位数,可改为: // avgObj[key] = Math.round((propertySums[key] / groupSize) * 100) / 100; }); result.push(avgObj); } return result; } // 测试示例 const sampleData = [ { time: '2024-01-01', temp: 20, humidity: 60 }, { time: '2024-01-02', temp: 22, humidity: 65 }, { time: '2024-01-03', temp: 21, humidity: 62 }, { time: '2024-01-04', temp: 23, humidity: 58 }, { time: '2024-01-05', temp: 24, humidity: 55 }, { time: '2024-01-06', temp: 22, humidity: 61 } ]; // groupBy=2时的结果 console.log(groupAndAverage(sampleData, 2)); // groupBy=3时的结果 console.log(groupAndAverage(sampleData, 3));
关键点说明
- 采用传统
for循环分割分组,贴合你习惯的写法 - 用
Object.keys()遍历对象属性,适配非固定数量和名称的属性 - 处理了属性缺失的情况:若组内某个对象无目标属性,视为0参与计算
time属性默认取组内第一个元素的值,可根据需求调整(比如取组内最后一个或拼接时间范围)
内容的提问来源于stack exchange,提问作者Henkkas
相关产品推荐
相关产品推荐

