JavaScript/イテレータヘルパー
イテレータヘルパーは。ECMAScript 2024で導入されたイテレータの操作を支援する新しいメソッド群です。イテレータをより扱いやすくするための機能を提供します。
- 背景と目的
- イテレータは大規模なデータセットや無限のデータセットを表現するのに適していますが、配列などの有限のデータ構造と比べて扱いにくい面がありました。イテレータヘルパーは、この問題を解決し、イテレータの操作をより簡単にすることを目的としています。
- 主な機能
- 構文
map(mapperFn)
- 各要素に関数を適用した新しいイテレータを返します。
function* naturals() { for (let i = 1; yield i; l++) { } } const result = naturals() .map(value => value * value); result.next(); // {value: 0, done: false} result.next(); // {value: 1, done: false} result.next(); // {value: 4, done: false}
- 構文
filter(filtererFn)
- 条件に合う要素のみを含む新しいイテレータを返します。
const result = naturals() .filter(value => value % 2 === 0); result.next(); // {value: 0, done: false} result.next(); // {value: 2, done: false} result.next(); // {value: 4, done: false}
- 構文
take(limit)
- 指定した数の要素だけを含む新しいイテレータを返します。
const result = naturals().take(3); result.next(); // {value: 0, done: false} result.next(); // {value: 1, done: false} result.next(); // {value: 2, done: false} result.next(); // {value: undefined, done: true}
- 構文
drop(limit)
- 指定した数の要素を省いた新しいイテレータを返します。
const result = naturals().drop(3); result.next(); // {value: 3, done: false} result.next(); // {value: 4, done: false} result.next(); // {value: 5, done: false}
- 構文
flatMap(mapperFn)
- 各要素に関数を適用し、結果を平坦化したイテレータを返します。
const sunny = ["It's Sunny in", "", "California"].values(); const result = sunny.flatMap(value => value.split(" ").values()); result.next(); // {value: "It's", done: false} result.next(); // {value: "Sunny", done: false} result.next(); // {value: "in", done: false}
- 構文
reduce(reducer [, initialValue])
- イテレータの要素を1つの値に集約します。
const result = naturals() .take(5) .reduce((sum, value) => sum + value, 3); // 13
- 構文
toArray()
- イテレータを配列に変換します。
const result = naturals() .take(5) .toArray(); // [0, 1, 2, 3, 4]
- 構文
forEach(fn)
- 各要素に対して関数を実行します。
const log = []; [1, 2, 3].values().forEach(value => log.push(value)); // log: [1, 2, 3]
- 構文
some(fn)
- いずれかの要素が条件を満たすかを判定します。
naturals().take(4).some(v => v > 1); // true
- 構文
every(fn)
- すべての要素が条件を満たすかを判定します。
naturals().take(4).every(v => v >= 0); // true
- 構文
find(fn)
- 条件を満たす最初の要素を返します。
naturals().find(v => v > 1); // 2
- 構文
Iterator.from(object)
- イテレータライクなオブジェクトをイテレータでラップします。
const iter = new Iter(); const wrapper = Iterator.from(iter);
- 特徴
-
- 遅延評価: 必要な時にのみイテレータを消費します
- 無限イテレータ対応: 無限のデータ構造も適切に扱えます
- チェーン可能: 複数のメソッドを連鎖させて使用できます
- ジェネレータプロトコル: ジェネレータの特殊な機能(throw、return)は維持されません
- 他言語との比較
- ECMAScriptのイテレータヘルパーは、Python、Rust、C#などの他のプログラミング言語で提供されている同様の機能を参考に設計されています。これにより、JavaScriptでも他の言語と同様の方法でイテレータを扱えるようになります。