Array.prototype.group()是ES2024新增的原生分组方法,返回以键为属性名、元素数组为值的对象;其姊妹方法groupToMap()返回支持任意类型键的Map;二者均不修改原数组,比reduce更安全、语义更清晰、性能更优。

Array.prototype.group() 是 ES2024 正式引入的原生数组方法,专为按键分组聚合设计,无需手写 reduce 或第三方库,语法简洁、语义清晰、性能良好。它不改变原数组,返回一个以分组键为属性名、对应元素数组为值的对象。
基本用法:传入回调函数生成分组键
回调函数接收当前元素、索引和原数组,必须返回一个可作为对象属性名的值(字符串、数字、Symbol,null 和 undefined 会被转为空字符串):
- 简单类型键:直接返回字符串或数字
-
复合逻辑键:可在回调中计算,如
item.status + '-' + item.priority - 安全处理空值:建议显式判断,避免意外分组到空字符串键下
示例:
const users = [
{ name: 'Alice', role: 'admin' },
{ name: 'Bob', role: 'user' },
{ name: 'Charlie', role: 'admin' }
];
const grouped = users.group(item => item.role);
// → { admin: [{name:'Alice',role:'admin'}, {name:'Charlie',role:'admin'}], user: [{name:'Bob',role:'user'}] }
配合 groupToMap 实现 Map 结构分组
若需 Map 实例(支持任意类型键、保持插入顺序、便于迭代),可用 Array.prototype.groupToMap() —— 它是 group() 的姊妹方法,行为一致但返回 Map:
- 键可以是对象、函数、日期等引用类型
- 避免字符串隐式转换带来的歧义(如
{id:1}和{id:'1'}在对象键中都变成[object Object]) - 适合需要键唯一性且类型多样的场景
示例:
const products = [
{ id: 1, category: { name: 'Electronics', code: 'ELEC' } },
{ id: 2, category: { name: 'Books', code: 'BK' } },
{ id: 3, category: { name: 'Electronics', code: 'ELEC' } }
];
const mapGrouped = products.groupToMap(item => item.category);
// → Map(2) { {name:'Electronics',code:'ELEC'} => [...], {name:'Books',code:'BK'} => [...] }
与 reduce 对比:更安全、更专注
相比手动 reduce 实现分组,group() 有明显优势:
- 自动初始化:无需预先声明空对象或检查键是否存在
- 不可变语义:不修改原数组,也不要求回调返回新对象(reduce 中易误改原对象)
- 错误边界清晰:回调返回非有效键时(如 NaN、function),会明确抛出 TypeError,而非静默失败
- 引擎优化空间大:V8 等引擎已对 group 进行底层优化,大数据量下性能更稳
实际聚合场景中的组合用法
group() 本身只做“分桶”,如需进一步聚合(求和、计数、平均值等),可链式调用 Object.entries() + map():
-
统计每组数量:
Object.fromEntries(Object.entries(grouped).map(([k, v]) => [k, v.length])) -
提取每组最大值:
Object.fromEntries(Object.entries(grouped).map(([k, v]) => [k, Math.max(...v.map(x => x.score))])) - 保留原始结构并附加聚合字段:先 group,再遍历 entries 构造新对象数组
注意:group() 不支持异步回调,也不支持深度嵌套键路径(如 item.address.city 需自行判空防报错)。

















