For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/2024/proposal-array-grouping.md.
  • 简体中文
  • Array Grouping S4

    中文标题:数组分组

    提案概览
    提案速览

    该提案解决了按键对数组元素进行分组的常见需求,提供了两个静态方法:Object.groupBy 用于普通对象和 Map.groupBy 用于对象作为键。该设计避免了 Array.prototype 方法的 Web 兼容性问题,并支持未来的 Records 和 Tuples。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    proposal-array-grouping

    注意:此提案现在处于第 4 阶段。查看规范 PR: https://github.com/tc39/ecma262/pull/3176

    一个使数组(和可迭代对象)中项目分组更简单的提案。

    const array = [1, 2, 3, 4, 5];
    
    // `Object.groupBy` 根据任意键对项目进行分组。
    // 在这个例子中,我们根据奇偶键进行分组
    Object.groupBy(array, (num, index) => {
      return num % 2 === 0 ? 'even': 'odd';
    });
    // =>  { odd: [1, 3, 5], even: [2, 4] }
    
    // `Map.groupBy` 返回一个 Map 中的项目,并且对于使用对象键进行分组很有用。
    const odd  = { odd: true };
    const even = { even: true };
    Map.groupBy(array, (num, index) => {
      return num % 2 === 0 ? even: odd;
    });
    // =>  Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }

    推动者

    状态

    当前阶段: 4

    动机

    数组分组是一个极其常见的操作,最好的例子是 SQL 的 GROUP BY 子句和 MapReduce 编程(这更像是 map-group-reduce)。将相似数据组合成组的能力使开发者能够计算更高阶的数据集,例如一群人的平均年龄或网页的每日 LCP 值。

    提供了两个方法,Object.groupByMap.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

    相关