コンテンツにスキップ

JavaScript/反復可能オブジェクト

出典: フリー教科書『ウィキブックス(Wikibooks)』


反復可能オブジェクト

[編集]

反復可能オブジェクト(Iterable Object)は、反復処理(反復子パターン)をサポートするJavaScriptのオブジェクトです。for...ofループやスプレッド構文、Array.from() などの構文や関数で使用できます。反復可能オブジェクトは、特別なメソッドである @@iteratorSymbol.iterator)を実装しています。

構文

[編集]

反復可能オブジェクトは、Symbol.iterator メソッドを持つオブジェクトとして定義されます。

定義

[編集]
const iterable = {
  [Symbol.iterator]() {
    return {
      next() {
        return { value: undefined, done: true };
      }
    };
  }
};
  • Symbol.iterator はオブジェクトに定義される特殊なメソッドで、反復子(Iterator)を返します。
  • 反復子には next() メソッドがあり、このメソッドは { value: 任意の値, done: 真偽値 } 形式のオブジェクトを返します。

使用例

[編集]

配列は反復可能オブジェクト

[編集]
const array = [1, 2, 3];

for (const item of array) {
  console.log(item); // 1, 2, 3
}

配列はデフォルトで反復可能オブジェクトであり、for...ofループで簡単に反復処理できます。

文字列も反復可能オブジェクト

[編集]
const str = "hello";

for (const char of str) {
  console.log(char); // h, e, l, l, o
}

文字列もデフォルトで反復可能オブジェクトとして実装されています。

カスタム反復可能オブジェクトの作成

[編集]
const customIterable = {
  [Symbol.iterator]() {
    let count = 0;
    return {
      next() {
        if (count < 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const value of customIterable) {
  console.log(value); // 0, 1, 2
}

Symbol.iterator を定義することで、独自の反復可能オブジェクトを作成できます。

スプレッド構文との使用

[編集]
const customIterable = {
  [Symbol.iterator]() {
    let count = 0;
    return {
      next() {
        if (count < 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

const result = [...customIterable];
console.log(result); // [0, 1, 2]

スプレッド構文は反復可能オブジェクトを配列に展開します。

Array.fromでの変換

[編集]
const customIterable = {
  [Symbol.iterator]() {
    let count = 0;
    return {
      next() {
        if (count < 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

const result = Array.from(customIterable);
console.log(result); // [0, 1, 2]

Array.from は反復可能オブジェクトを配列に変換する便利な関数です。

特徴と注意点

[編集]
  • 標準反復可能オブジェクト: 配列、文字列、MapSet など多くのビルトインオブジェクトは反復可能です。
  • 反復子パターン: for...of やスプレッド構文など、反復子パターンをサポートする文法と連携します。
  • カスタマイズ可能: 独自の反復可能オブジェクトを作成することで、独自のロジックを反復処理に組み込むことができます。
  • Symbol.iterator が必須: 反復可能オブジェクトであるためには、Symbol.iterator を正しく実装する必要があります。

関連項目

[編集]

参考

[編集]