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

如何对含可变属性的对象数组按组计算平均值?

分组计算对象数组的属性平均值

实现思路

  1. 按指定的groupBy数量将数组分割为若干子组
  2. 对每个子组,遍历所有非time属性,累加属性值总和
  3. 用总和除以组内元素数量得到平均值,最终整理为包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:45:24