Iterator
イテレータ( Iterator ) は、反復処理するための特殊なオブジェクトです。順次データを取り出すためのオブジェクトを生成します。
String、RegExp、Generator、Map、Set、Segments といったオブジェクトを繰り返し文 for( values of array ){...} で利用可能にします。
配列 Array 型は for( values of array ){...} で利用可能ですがイテレータではありません。Array.prototype.values() メソッドでイテレータにすることはできます。
const example_list = [ "a", "b", "c", "d", "e", "f" ]; console.log( example_list ); let iterator_ = example_list.values(); console.log( iterator_ );
配列 Array 型のメソッド keys() や entries() はイテレータを返すとあります。イテレータでは for( values of array ){...} の他に next() メソッドで順次データを取り出します。
構文( Syntax )
イテレータ( Iterator ) は、反復処理を可能にするための特殊なオブジェクトです。String、RegExp、Generator、Map、Set、Segments、配列 といったオブジェクトを繰り返し可能な配列に変換します。
配列の場合は .values() メソッドなどでイテレータに変換できます。
例えば配列オブジェクトから .values() メソッドで Iterator オブジェクトが取得できます。
配列は Iterator ではありません。
配列の順を示す番号が keys() で取得できますが、これも Iterator です。
const example_list = [ "a", "b", "c", "d", "e", "f" ]; let list_keys = example_list.keys(); console.log( list_keys );
Iterator には next() というメソッドと、各データに value と done というプロパティがあります。
next() メソッドは Iterator のデータを順次取得できます。これらを使用して entries() からデータを取得します。
各データの value がデータです。done は処理するデータがあるか/ないかが分かります。
以下は配列 Array 型のメソッド entries() を使った例です。 entries() は配列番号とデータの Iterator オブジェクトを返します。
イテレーター( Iterator ) を返すメソッド
配列、String、正規表現、Generator、Map、Set、Segments ごとにイテレータを返す
配列には以下のメソッドがイテレータを返します。
- .entries()
- .keys()
- .values()
- .matchAll( regexp )
- [Symbol.matchAll]
ジェネレーターに関しては以下のジェネレータ
を参照してください。
反復可能なオブジェクトをイテレータに変換するメソッド [Symbol.iterator]()
があります。
[Symbol.iterator]()
const str = [ "Hello World!" ];
const str_iterator = str[Symbol.iterator]();
[Symbol.iterator]()
は反復可能なオブジェクトに追加することでイテレータに変換します。
プロパティ( Property )
以下はイテレータでリストされた各データにおけるプロパティです。*イテレータ自身のプロパティではありません。
メソッド | 概要 |
---|---|
.value | 次の値。次がなければ undefined になる |
.done | 値がない場合は true になる。値がある場合は false になることに注意 |
メソッド
メソッド | 概要 |
---|---|
.next() | イテレータのデータを順次返す |
ジェネレータ( generator )
以下のようにジェネレータ( generator )で定義したオブジェクトを Iterator として使用する方法もあります。
function* example_generator(){ // functionに*が付く yield 'a'; // yiels ステートメントで取り出すデータを定義 yield 'b'; yield 'c'; yield 'd'; yield 'e'; } const _iterator = example_generator(); // Iterator に変換 console.log( _iterator.next() ); // next() でデータを順次取得 console.log( _iterator.next() ); console.log( _iterator.next() ); console.log( _iterator.next() ); console.log( _iterator.next() );
function の後に*
が付くことでジェネレータ( generator )の定義であることを示します。
ジェネレータ( generator )は非同期通信で利用される関数です。ジェネレータで定義された引数を yield に定義した関数に渡すことができます。