Array Grouping S4
中文标题:数组分组
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2024
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案解决了按键对数组元素进行分组的常见需求,提供了两个静态方法:Object.groupBy 用于普通对象和 Map.groupBy 用于对象作为键。该设计避免了 Array.prototype 方法的 Web 兼容性问题,并支持未来的 Records 和 Tuples。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
proposal-array-grouping
注意:此提案现在处于第 4 阶段。查看规范 PR: https://github.com/tc39/ecma262/pull/3176
一个使数组(和可迭代对象)中项目分组更简单的提案。
推动者
- Justin Ridgewell (@jridgewell)
- Jordan Harband (@ljharb)
状态
当前阶段: 4
动机
数组分组是一个极其常见的操作,最好的例子是 SQL 的 GROUP BY 子句和 MapReduce 编程(这更像是 map-group-reduce)。将相似数据组合成组的能力使开发者能够计算更高阶的数据集,例如一群人的平均年龄或网页的每日 LCP 值。
提供了两个方法,Object.groupBy 和 Map.groupBy。第一个返回一个空原型对象,这允许符合人体工程学的解构,并防止与全局 Object 属性的意外冲突。第二个返回一个常规的 Map 实例,这允许对复杂键类型进行分组(想象一个复合键或[元组])。
为什么使用静态方法?
我们发现了 Array.prototype.groupBy 名称的 Web 兼容性问题。Sugar 库在 v1.4.0 之前有条件地使用不兼容的方法 monkey-patch Array.prototype。通过提供原生的 groupBy,这些版本的 Sugar 将无法安装它们的实现,任何依赖其行为的网站都会崩溃。我们发现大约有 660 个来源使用了这些版本的 Sugar 库。
然后我们尝试了 Array.prototype.group 的名称,但这遇到了使用数组作为任意哈希映射的代码。由于这些 bug 极其难以检测(需要开发者检测并知道如何向我们报告 bug),委员会不想再尝试使用另一个原型方法名称。相反,我们选择了静态方法,我们相信这足够非正统,不会有 Web 兼容性风险。这也为我们将来支持 Records 和 Tuples 提供了一种很好的方式。
Polyfill
- 在 core-js 库中提供了一个 polyfill。您可以在 ECMAScript 提案部分 中找到它。
相关
- Lodash