ループ処理を自由自在に操る!Array.@@iteratorでJavaScriptプログラミングをレベルアップ


Array.@@iterator は、JavaScript の Array オブジェクトに関連する特殊なメソッドです。このメソッドは、イテレータと呼ばれるオブジェクトを返します。イテレータは、ループ処理などで順序的に要素を処理するために使用されます。

詳細

Array.@@iterator メソッドは、次の 2 つのプロパティを持つオブジェクトを返します。

  • done: イテレーションが完了したかどうかを示すブール値です。
  • next(): 次の要素を返すメソッドです。

以下の例は、Array.@@iterator メソッドを使用して、Array の要素をループ処理する方法を示しています。

const numbers = [1, 2, 3, 4, 5];
const iterator = numbers[Symbol.iterator]();

let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}

このコードは、次の出力を生成します。

1
2
3
4
5

注意点

Array.@@iterator メソッドは、直接呼び出す必要はありません。for...of ループなどの構文は、自動的にこのメソッドを呼び出してイテレータを取得します。

Array.@@iterator メソッドは、Array オブジェクトの要素をループ処理するために使用されるイテレータを取得するために使用されます。このメソッドは、ループ処理をより柔軟かつ効率的に行うために役立ちます。

  • Array.@@iterator メソッドは、ES6 で導入されました。
  • イテレータは、JavaScript の重要な概念であり、ループ処理以外にもさまざまな用途で使用できます。


例 1: for...of ループを使って要素を配列にコピーする

この例では、for...of ループを使って sourceArray の要素を targetArray にコピーします。

const sourceArray = [1, 2, 3, 4, 5];
const targetArray = [];

for (const element of sourceArray) {
  targetArray.push(element);
}

console.log(targetArray); // [1, 2, 3, 4, 5]

例 2: イテレータを使って要素を逆順にループする

この例では、イテレータを使って sourceArray の要素を逆順にループします。

const sourceArray = [1, 2, 3, 4, 5];
const iterator = sourceArray[Symbol.iterator]();

let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}

// 逆順にループ: [5, 4, 3, 2, 1]

例 3: イテレータを使って要素を条件付きでループする

この例では、イテレータを使って sourceArray の要素をループし、偶数のみを出力します。

const sourceArray = [1, 2, 3, 4, 5];
const iterator = sourceArray[Symbol.iterator]();

let result = iterator.next();
while (!result.done) {
  if (result.value % 2 === 0) {
    console.log(result.value);
  }
  result = iterator.next();
}

// 偶数のみ: [2, 4]

例 4: イテレータを使ってオブジェクトに変換する

この例では、イテレータを使って sourceArray の要素をオブジェクトに変換します。

const sourceArray = [1, 2, 3, 4, 5];
const iterator = sourceArray[Symbol.iterator]();
const obj = {};

let result = iterator.next();
while (!result.done) {
  obj[result.value] = true;
  result = iterator.next();
}

console.log(obj); // {1: true, 2: true, 3: true, 4: true, 5: true}

例 5: イテレータを使って要素を新しい配列にマッピングする

この例では、イテレータを使って sourceArray の要素を 2 倍した新しい配列を作成します。

const sourceArray = [1, 2, 3, 4, 5];
const iterator = sourceArray[Symbol.iterator]();
const mappedArray = [];

let result = iterator.next();
while (!result.done) {
  mappedArray.push(result.value * 2);
  result = iterator.next();
}

console.log(mappedArray); // [2, 4, 6, 8, 10]


for ループ

最も基本的な代替方法は、従来の for ループを使用することです。

const numbers = [1, 2, 3, 4, 5];

for (let i = 0; i < numbers.length; i++) {
  console.log(numbers[i]);
}

利点

  • ほとんどの状況で十分
  • シンプルで分かりやすい

欠点

  • 末尾要素のインデックスを計算する必要がある
  • 配列の長さを取得する必要がある
  • イテレータよりも冗長

forEach メソッド

forEach メソッドは、Array オブジェクトの各要素に対して関数を一度だけ実行します。

const numbers = [1, 2, 3, 4, 5];

numbers.forEach(function(number) {
  console.log(number);
});

利点

  • コールバック関数内で要素を直接処理できる
  • for ループよりも簡潔

欠点

  • 要素のインデックスにアクセスできない
  • ループを途中で抜けられない

Array.from メソッドとイテレータ

Array.from メソッドは、イテレータを受け取って、新しい Array オブジェクトを作成します。この方法を組み合わせることで、Array.@@iterator と同様の機能を実現できます。

const numbers = [1, 2, 3, 4, 5];
const iterator = numbers[Symbol.iterator]();
const newArray = Array.from(iterator);

console.log(newArray); // [1, 2, 3, 4, 5]

利点

  • 新しい Array オブジェクトを作成できる
  • Array.@@iterator とほぼ同じ挙動

欠点

  • コードが少し冗長

ジェネレータ

ジェネレータは、関数の一種で、イテレーション可能なオブジェクトを生成できます。

function numberGenerator() {
  let i = 0;
  while (i < 5) {
    yield i++;
  }
}

const iterator = numberGenerator();

let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}

利点

  • メモリ使用量が少ない
  • コードがよりエレガントで簡潔

欠点

  • 古いブラウザではサポートされていない
  • 理解するのが少し難しい

状況に応じて、最適な代替方法を選択することが重要です。

  • コードをよりエレガントにしたい場合は、ジェネレータがおすすめです。
  • Array.@@iterator と同様の機能が必要であれば、Array.from メソッドとイテレータを組み合わせる方法がおすすめです。
  • 簡潔な方法が必要であれば、forEach メソッドがおすすめです。
  • シンプルで分かりやすい方法が必要であれば、for ループがおすすめです。