Object.groupBy 是 ECMAScript 2024 标准方法,用于对象数组按键分组;需先标准化异构数据格式,支持多维键对象、需手动结合流状态管理,并须兼容性降级。

Object.groupBy 是 ECMAScript 2024 正式纳入的标准方法,专为对象数组按键快速分组设计。它适用于将多个来源(如 WebSockets、Fetch 流、EventSource)接收到的异构数据,按业务维度(如设备 ID + 时间窗口 + 状态类型)实时归类,但需注意:它本身不处理“流式”逻辑,必须配合流控制机制使用。
核心前提:数据需先统一为规范对象数组
不同端的数据格式往往不一致(例如 A 端发 {id: "d1", temp: 23.5},B 端发 {deviceId: "d1", value: 23.5, unit: "C"})。在调用 Object.groupBy 前,必须做标准化映射:
- 定义统一 schema,如 { deviceId, metric, value, timestamp, source };
- 对每条入站数据执行转换函数,确保字段名、时间戳格式(推荐毫秒级 number)、数值类型一致;
- 丢弃无法解析或关键字段缺失的数据,避免 groupBy 报错或产生空组。
多维分组键:用对象字面量组合多个维度
要实现“设备 × 小时 × 告警等级”的三维聚合,group key 应返回一个对象,而非单一值:
- 示例键生成函数:item => ({ deviceId: item.deviceId, hour: Math.floor(item.timestamp / 3600000), level: item.level });
- Object.groupBy 会自动基于该对象的结构进行深比较(利用 Object.is 和属性顺序),相同结构的对象视为同一组;
- 注意:不能用 Date 对象或函数作为键属性,应转为字符串或数字(如 new Date(ts).toISOString().slice(0,13) 表示年-月-日小时)。
与流式更新结合:手动维护聚合状态
Object.groupBy 本身是纯函数、无状态、一次性操作。要支持“实时”,需在外层构建状态容器:
- 维护一个全局 Map 或 plain object,以 group key 字符串(如 JSON.stringify(key))为索引,存对应组的最新数据数组;
- 每收到新数据,先标准化 → 生成 key → 转为字符串 → 推入对应数组(可限制长度防内存溢出);
- 需要输出当前聚合结果时,再对各组调用 reduce/sum/avg 等计算,或直接返回原始分组结构供下游消费。
兼容性兜底:生产环境必须降级
Chrome 117+/Edge 117+ 原生支持,但 Safari、Firefox 及多数 Node.js 版本尚未实现。安全做法是:
- 检测支持性:typeof Object.groupBy === 'function';
- 不支持时,用 reduce 手写等效逻辑(创建空对象,遍历数组,用 JSON.stringify(key) 作唯一键存数组);
- 或引入轻量 polyfill(如 core-js 提供的 Object.groupBy shim),但注意其性能略低于原生。

















