Array.prototype.group() 一行代码实现按字段或计算逻辑分组,返回键为字符串的对象;需兼容旧环境时用 core-js 垫片;键类型敏感时应改用 Map.groupBy()。

直接用 Array.prototype.group() 就行,一行代码完成分类聚合,不用写 reduce 或 for 循环。
基础用法:按字段值自动分组
适用于按字符串字段(如 status、type、category)快速归类。回调函数返回哪个字段,就按那个字段的值分组。
- 传入数组和一个取值函数,例如
item => item.status或({ type }) => type - 返回一个普通对象,属性名是各不相同的字段值(自动转为字符串),属性值是对应元素组成的数组
- 示例:订单按支付状态分组
{ id: 1, title: '手机', status: 'paid' },
{ id: 2, title: '耳机', status: 'unpaid' },
{ id: 3, title: '充电器', status: 'paid' }
];
const grouped = orders.group(item => item.status);
// → { paid: [...], unpaid: [...] }
进阶用法:用计算逻辑生成分组键
不只是读字段,还能做判断、截取、格式化,让分组更贴合业务口径。
- 回调中可任意处理,比如
item => item.amount > 5000 ? 'high' : 'low' - 或按日期提取年月:
item => new Date(item.createdAt).toISOString().slice(0, 7) - 注意:返回值会作为对象属性名,非字符串类型会调用
toString(),慎用数字或布尔值作键(如需精确类型,改用Map.groupBy())
兼容性处理:老环境也能用
Node.js 22+、Chrome 125+ 等新环境已原生支持;旧版本需垫片。
- 检查是否存在:
if (!Array.prototype.group) { /* 加载 polyfill */ } - 推荐用
core-js/actual/array/group,避免自己手写 reduce 模拟时遗漏边界情况 - 若项目已用 Babel,确保配置了
core-js并启用 ES2024 提案支持
什么时候该换用 Map.groupBy()
当分组键可能是 null、undefined、对象、Symbol 或原始数字(且需保持类型)时,Object 分组会出错或丢失精度。
-
Map.groupBy()返回 Map 实例,支持任意类型的键 - 调用方式一致:
orders.groupByToMap(item => item.category)或Map.groupBy(orders, item => item.category) - 适合需要迭代顺序保障、键类型敏感或后续要频繁增删查的场景










