JavaScript中可用reduce按字段或条件将数组分组为对象,基础写法需初始化空对象并手动处理键不存在情况,推荐用??=简化;可封装为通用groupBy函数支持属性名或回调,注意键必须为基本类型且初始值不可省略。

JavaScript 中可以用 reduce 把数组按某个字段(或条件)聚合成对象,每个键对应一组元素,这就是常见的“分组”效果。
基础写法:按对象属性分组
比如把用户列表按 status 分组:
(假设 users 是一个用户数组,每个用户有 name 和 status 字段)
const grouped = users.reduce((acc, user) => {
const key = user.status;
if (!acc[key]) acc[key] = [];
acc[key].push(user);
return acc;
}, {});
结果形如:{ active: [...], inactive: [...] }。
立即学习“Java免费学习笔记(深入)”;
更简洁的写法(避免重复判断)
用逻辑运算符或空值合并操作符初始化数组:
acc[key] = acc[key] || []- 或 ES2020+:
acc[key] ??= []
完整示例:
const grouped = users.reduce((acc, user) => {
const key = user.status;
acc[key] ??= [];
acc[key].push(user);
return acc;
}, {});
支持任意分组依据:传入回调函数
封装成可复用函数,让分组逻辑更灵活:
function groupBy(arr, keyOrFn) {
return arr.reduce((acc, item) => {
const key = typeof keyOrFn === 'function'
? keyOrFn(item)
: item[keyOrFn];
acc[key] ??= [];
acc[key].push(item);
return acc;
}, {});
}
用法示例:
groupBy(users, 'status')-
groupBy(users, u => u.name.charAt(0).toUpperCase())(按姓名首字母分组)
注意点和常见坑
别忘了初始值:reduce 的第二个参数必须是空对象 {},否则第一次迭代会出错。
键类型要小心:如果用对象、数组等非基本类型作 key,会被自动转成 [object Object],应先序列化或改用 Map。
不想修改原数组?没问题:reduce 本身不改变原数组,但要注意 push 会修改新创建的子数组——这通常是预期行为。


















