javascript无原生groupby,可用reduce+对象或map实现分组:对象适合简单类型键,map支持任意键类型;可封装为通用函数,支持属性名字符串、取值函数及嵌套路径安全访问。

JavaScript 中没有原生的 groupBy 方法,但可以通过 reduce 配合对象或 Map 实现按指定属性对对象数组分组,核心是用属性值作为键,收集对应对象到数组中。
用 reduce + 普通对象分组
最常用、易理解的方式:遍历数组,以目标属性值为 key,将当前对象 push 到对应 key 的数组中。
- 确保属性存在且非 undefined,避免
undefined作为 key(可加空值判断) - 初始化时用空对象
{},key 自动转为字符串(如数字 1 → "1") - 适合属性值类型简单(字符串、数字、布尔)的场景
const grouped = users.reduce((acc, item) => {
const key = item.role;
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});
// { admin: [{id:1,role:'admin'}, {id:3,role:'admin'}], user: [{id:2,role:'user'}] }
用 reduce + Map 分组(支持任意 key 类型)
当分组依据可能是对象、函数、Symbol 或需要严格区分 0 和 "0" 时,Map 更可靠。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Map 键不自动转字符串,保留原始类型和引用
- 需手动调用
map.get(key) || []获取数组,再 push - 返回结果是 Map,如需普通对象可用
Object.fromEntries(map)
const key = item.role;
const list = map.get(key) || [];
list.push(item);
map.set(key, list);
return map;
}, new Map());
封装成可复用的 groupBy 函数
提取通用逻辑,支持传入属性名字符串或取值函数,提升复用性。
- 支持点号路径(如
"address.city")可借助_.get或简单实现 - 对 null/undefined 属性值统一归入
"null"或跳过,避免意外 key - 返回对象结构清晰,便于后续处理
const getKey = typeof keyOrFn === 'function'
? keyOrFn
: item => item[keyOrFn];
return array.reduce((acc, item) => {
const key = getKey(item);
const groupKey = key == null ? 'null' : key;
if (!acc[groupKey]) acc[groupKey] = [];
acc[groupKey].push(item);
return acc;
}, {});
}
// 使用:
groupBy(users, 'role');
groupBy(users, u => u.id % 2 === 0 ? 'even' : 'odd');
注意嵌套属性与边界情况
直接访问 item.a.b.c 容易报错,需安全取值。
- 避免
Cannot read property 'x' of undefined,可用可选链item?.a?.b?.c(ES2020+) - 或写一个安全取值工具函数,处理空对象、数组索引等
- 空数组、无匹配项时返回空对象,符合直觉
const get = (obj, path) => {
return path.split('.').reduce((cur, part) => cur?.[part], obj);
};
groupBy(users, item => get(item, 'profile.level'));
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










