Joint Iteration S4
中文标题:联合迭代
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2027
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案通过添加 Iterator.zip 和 Iterator.zipKeyed 方法,解决了同步多个迭代器推进的需求,将多个可迭代对象中的对应值组合成数组或对象。它通过选项支持 "shortest"、"longest" 和 "strict" 等模式,并在 "longest" 模式下为较短的输入提供填充。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
联合迭代
一个 TC39 提案,用于同步多个迭代器的推进,通常称为 zip。
阶段: 4。参见 tc39/ecma262#3802 的集成 PR。
演示: https://tc39.es/proposal-joint-iteration/demo/
规范: https://tc39.es/proposal-joint-iteration/
动机
通常你有两个或更多的迭代器,它们位置对齐(第一个迭代器产生的第一个值与另一个迭代器产生的第一个值对应,依此类推),并且你希望同时操作对应的值。一种常见的解决方案是 zip,它产生一个组合值的迭代器。zipWith 允许以元组之外的方式组合值。某些语言将 zipWith 表示为可变参数的 map。
向委员会做的展示
提案
该提案添加两个方法:Iterator.zip 和 Iterator.zipKeyed。zip 接受一个可迭代对象的可迭代对象,并产生一个数组的可迭代对象,其中位置对应于传入可迭代对象中的位置。zipKeyed 接受一个对象,其值是可迭代对象,并产生一个对象的可迭代对象,其中键对应于传入对象中的键。
两种方法都将一个选项对象作为第二个参数,该对象允许指定 mode 为 "shortest"(默认)、"longest" 或 "strict"。
对于 "longest",选项对象还可以通过提供可迭代对象或对象(分别用于 zip 和 zipKeyed)来定义用于较短输入的填充:
考虑的设计空间
- 我们是只支持2个迭代器还是支持其他?2个以上?1个以上?0个以上?决定:0个以上。
- 如果允许0个,那被认为是永不完结的还是已经完成的?决定:已经完成。
- 迭代器应该按位置传递(组合成数组)还是按名称传递(组合成对象)?决定:两者都支持,作为独立的API。
- 我们是将迭代器作为可变参数还是作为可迭代对象/对象?决定:可迭代对象/对象。
- 可变参数消除了可能传递选项对象或组合函数的设计空间。
- 我们是否支持像
Iterator.from和flatMap那样的迭代器和可迭代对象?决定:仅支持可迭代对象。- 如果是,我们匹配哪种字符串处理?
Iterator.from迭代字符串;flatMap拒绝字符串。
- 如果是,我们匹配哪种字符串处理?
- 如果某个迭代器完成,我们是否仍然推进其他迭代器?决定:取决于模式。
- 我们是否
return它们?决定:是,除了模式为longest时。
- 我们是否
- 如果某个迭代器推进失败,我们是否仍然推进其他迭代器?决定:是。
- 如果是,我们是否返回
AggregateError?仅当有2个或更多失败时?决定:不,第一个错误会吞掉任何后续错误。
- 如果是,我们是否返回
- 我们是否想要
-With变体来以元组之外的方式组合值?决定:本次提案不包含。- 那始终要求组合函数呢?
- 我们是否想要
zipLongest/zipFilled/zipAll?决定:是,作为选项。- 如果是,我们想要一个填充元素还是调用一个函数来提供填充?决定:每个可迭代对象的填充元素。
- 那一个匹配特权迭代器(
this)长度的变体呢?决定:不。
- 我们是否想要一个
zipEqual/zipStrict,如果它们在相同次数的产出后未完成则抛出异常?决定:是,作为选项。