Object.groupBy 尚未成为 JavaScript 标准方法(处于 TC39 Stage 3),需用 reduce 手动实现或借助 lodash.groupBy;推荐封装 groupBy 函数支持字符串键或回调,兼顾兼容性与语义清晰。

Object.groupBy 目前(截至 2024 年)还不是 JavaScript 标准内置方法,它仍处于 TC39 提案阶段(Stage 3),尚未被所有浏览器和 Node.js 版本原生支持。直接调用 Object.groupBy(array, callback) 会报错 TypeError: Object.groupBy is not a function。
如何安全使用类似 Object.groupBy 的功能
虽然原生不支持,但可通过以下方式实现等效分组逻辑,且代码简洁、语义清晰:
- 用
Array.prototype.reduce()手动构建分组对象(最通用、兼容性最好) - 使用现代运行时(如 Chrome 117+、Node.js 20.10+)并开启实验性 flag(不推荐用于生产)
- 借助轻量库如
lodash.groupBy(仅需 2KB,无副作用)
用 reduce 模拟 Object.groupBy(推荐)
这是最可靠、无需依赖、一行核心逻辑就能完成的方式:
const data = [
{ name: 'Alice', age: 28, city: 'Beijing' },
{ name: 'Bob', age: 32, city: 'Shanghai' },
{ name: 'Charlie', age: 28, city: 'Beijing' },
{ name: 'Diana', age: 32, city: 'Guangzhou' }
];
<p>// 按 age 分组
const groupedByAge = data.reduce((acc, item) => {
const key = item.age; // 分组依据:取 age 值作为键
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});</p><p>// 结果:{ 28: [...], 32: [...] }
可封装为复用函数:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const groupBy = (array, keyOrFn) => {
const getKey = typeof keyOrFn === 'function' ? keyOrFn : item => item[keyOrFn];
return array.reduce((acc, item) => {
const key = getKey(item);
if (!acc[key]) acc[key] = [];
acc[key].push(item);
return acc;
}, {});
};
<p>// 使用示例
groupBy(data, 'city'); // 按 city 字符串分组
groupBy(data, item => Math.floor(item.age / 10) + '0s'); // 自定义分组逻辑:'20s', '30s'
按条件统计数量(分组 + 计数)
如果目标是“分组后统计每组数量”,不必先分组再 map,可一步到位:
const countBy = (array, keyOrFn) => {
const getKey = typeof keyOrFn === 'function' ? keyOrFn : item => item[keyOrFn];
return array.reduce((acc, item) => {
const key = getKey(item);
acc[key] = (acc[key] || 0) + 1;
return acc;
}, {});
};
<p>countBy(data, 'city'); // { Beijing: 2, Shanghai: 1, Guangzhou: 1 }
countBy(data, 'age'); // { 28: 2, 32: 2 }
注意兼容性和未来适配
若你确需使用提案中的 Object.groupBy API(例如在支持它的环境做实验),语法如下:
// ⚠️ 当前仅部分环境支持(需确认 runtime) // const grouped = Object.groupBy(data, item => item.city);
为将来平滑过渡,建议:
- 当前项目统一用
groupBy封装函数,保持接口一致 - 未来可在入口处做一次特性检测,动态切换实现:
const safeGroupBy = (array, cb) => {
if (typeof Object.groupBy === 'function') {
return Object.groupBy(array, cb);
}
return array.reduce(/* ... */);
};
不复杂但容易忽略:分组键值必须是字符串或 symbol;数字键会被自动转为字符串(如 28 → "28"),这通常符合预期,但要注意 null 和 undefined 也会变成字符串 "null" 或 "undefined"。

















