JavaScript中常用reduce结合对象或Map实现数组分组,如按性别或年龄区间分类,兼容性好且逻辑清晰,推荐使用;Map适用于复杂键类型,而Object.groupBy为实验性新特性,暂不建议生产环境使用。

JavaScript 中对数组进行分组是一个常见需求,比如按类别、年份或状态将数据归类。现代 JavaScript 提供了简洁高效的方法来实现数组分组,尤其是结合 Array.reduce() 和 Map 或普通对象的方式最为常用。下面介绍几种实用且清晰的分组方法。
使用 reduce 进行基础分组
这是最经典也最灵活的方式。通过 reduce 遍历数组,并根据某个属性值累积生成分组对象。
例如,有一组用户数据,想按性别分组:
const users = [
{ name: 'Alice', gender: 'female' },
{ name: 'Bob', gender: 'male' },
{ name: 'Charlie', gender: 'male' },
{ name: 'Diana', gender: 'female' }
];
const grouped = users.reduce((acc, item) => {
const key = item.gender;
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});
// 结果:
// {
// female: [ {name: 'Alice', ...}, {name: 'Diana', ...} ],
// male: [ {name: 'Bob', ...}, {name: 'Charlie', ...} ]
// }
使用 Map 对象进行更复杂的分组
当你需要更灵活的键类型(如对象、函数)作为分组依据时,Map 比普通对象更合适。同时,Map 提供了更好的性能和内置方法。
示例:按年龄区间分组
const people = [
{ name: 'Tom', age: 25 },
{ name: 'Jerry', age: 34 },
{ name: 'Lucy', age: 19 },
{ name: 'John', age: 36 }
];
const groupByAgeRange = people.reduce((map, person) => {
const range = person.age < 30 ? 'under-30' : '30-and-over';
if (!map.has(range)) map.set(range, []);
map.get(range).push(person);
return map;
}, new Map());
// 转为对象(可选)
Object.fromEntries(groupByAgeRange);
封装可复用的分组函数
为了提高代码复用性,可以封装一个通用的 groupBy 函数,接受数组和分组条件函数作为参数。
立即学习“Java免费学习笔记(深入)”;
function groupBy(array, keyFn) {
return array.reduce((acc, item) => {
const key = keyFn(item);
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});
}
// 使用方式
const groupedByGender = groupBy(users, user => user.gender);
const groupedByInitial = groupBy(users, user => user.name[0].toUpperCase());
利用 Object.groupBy(实验性,仅部分环境支持)
ECMAScript 正在提案引入原生的 Object.groupBy 方法,目前仅在较新版本的 Chrome 和 Node.js(需启用 flag)中可用。
语法示例:
// 注意:目前不建议生产环境使用 const grouped = Object.groupBy(users, user => user.gender);该方法返回一个对象,结构与 reduce 方式一致,未来可能成为标准。
基本上就这些。日常开发中推荐使用 reduce 方式,兼容性好、逻辑清晰。如果项目环境较新,也可关注 Object.groupBy 的进展。关键是理解“累积 + 分类”的思维模式,就能应对各种分组场景。










