備忘録的プログラミングリファレンス

Iterator

 イテレータ( Iterator ) は、反復処理するための特殊なオブジェクトです。順次データを取り出すためのオブジェクトを生成します。

 StringRegExpGenerator、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() メソッドで順次データを取り出します。

ページ内 Index

構文( Syntax )

 イテレータ( Iterator ) は、反復処理を可能にするための特殊なオブジェクトです。StringRegExpGenerator、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()

 String

  • .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 として使用する方法もあります。

Iterator と generator
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 に定義した関数に渡すことができます。