ループ処理を自由自在に操る!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
ループがおすすめです。