この記事では『for…of文』について、
- for…of文とは
- for…of文のプログラム例
- 配列に対して繰り返し処理をする
- Setオブジェクトに対して繰り返し処理をする
- Mapオブジェクトに対して繰り返し処理をする
- 文字列に対して繰り返し処理をする
- for…of文でオブジェクトをループする方法
- for…of文でインデックスがほしい場合の対応方法
などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。
for…of文とは
for…of文は、配列などの反復可能オブジェクトを順に処理する際に用います。
for…of
文の構文を以下に示します。
for…of文の構文
for(変数 of 反復可能オブジェクト){
反復可能オブジェクトの各要素に対する繰り返し処理
}
反復可能オブジェクトオブジェクトには、配列(Array
)、Map
オブジェクト、Set
オブジェクト、文字列(String
)、arguments
オブジェクト、NodeList
などがあります。
反復可能オブジェクトの要素数回だけ繰り返し処理を行います。
- 配列やSetオブジェクトの場合
- 繰り返し処理を行うたびに、変数には値が格納されます。
- Mapオブジェクトの場合
- 繰り返し処理のたびに、変数にはプロパティと値が対になった配列が[プロパティ,値]という形式で格納されます。
- 文字列の場合
- 繰り返し処理のたびに、変数には文字が格納されます。
for…of文のプログラム例
for…of文のプログラム例(配列に対して繰り返し処理をする)
for…of
文を用いて、配列に対して繰り返し処理をしているプログラム例を以下に示します。
const fruits = ['りんご', 'バナナ', 'オレンジ'];
for (const fruit of fruits) {
console.log(fruit);
}
// ログ出力結果
// りんご
// バナナ
// オレンジ
for...of
文は配列の要素数だけ繰り返し処理が行われるので、上記のプログラムの場合、3回処理が繰り返しています。また、変数fruit
には、順番に「りんご」、「バナナ」、「オレンジ」という文字列が代入されます。なお、上記のプログラムでは、各要素に対して再代入をしないので、const
を用いています。各要素に対して再代入をする必要がある場合には、let
を用いてください。
なお、for...of
文ではなくfor
文を用いた場合には以下のように記述します。
const fruits = ['りんご', 'バナナ', 'オレンジ'];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// ログ出力結果
// りんご
// バナナ
// オレンジ
for
文を用いた場合、配列名[インデックス]
で配列の各要素にアクセスしたり、配列の要素数を取得するために、length
プロパティを用いたりするので、コードが複雑になります。for...of
文を用いることでコードがシンプルになります。
for…of文のプログラム例(Setオブジェクトに対して繰り返し処理をする)
for…of
文を用いて、Set
オブジェクトに対して繰り返し処理をしているプログラム例を以下に示します。
const fruits = new Set(['りんご', 'バナナ', 'オレンジ']);
for (const fruit of fruits) {
console.log(fruit);
}
// ログ出力結果
// りんご
// バナナ
// オレンジ
for...of
文は配列の要素数だけ繰り返し処理が行われるので、上記のプログラムの場合、3回処理が繰り返しています。また、変数fruit
には、順番に「りんご」、「バナナ」、「オレンジ」という文字列が代入されます。
for…of文のプログラム例(Mapオブジェクトに対して繰り返し処理をする)
for…of
文を用いて、Map
オブジェクトに対して繰り返し処理をしているプログラム例を以下に示します。
const map = new Map([
['apple', 'りんご'],
['banana', 'バナナ'],
['orange', 'オレンジ'],
]);
for (const fruit of map) {
console.log(fruit[0], fruit[1]);
}
// ログ出力結果
// apple りんご
// banana バナナ
// orange オレンジ
for…of
文の変数fruit
は配列であり、配列の0番目にキーが格納され、1番目に値が格納されます。
補足
以下のように、配列の分割代入を使うことで、キーと値を変数key
と変数value
に直接代入することもできます。
const map = new Map([
['apple', 'りんご'],
['banana', 'バナナ'],
['orange', 'オレンジ'],
]);
// 配列の分割代入を使うことで、キーと値を変数keyと変数valueに直接代入している。
for (const [key, value] of map) {
console.log(key, value);
}
// ログ出力結果
// apple りんご
// banana バナナ
// orange オレンジ
for…of文のプログラム例(文字列に対して繰り返し処理をする)
for…of
文を用いて、文字列に対して繰り返し処理をしているプログラム例を以下に示します。
const str = 'hello';
for (const ch of str) {
console.log(ch);
}
// ログ出力結果
// h
// e
// l
// l
// o
for...of
文は文字列の長さだけ繰り返し処理が行われるので、上記のプログラムの場合、5回処理が繰り返しています。また、変数ch
には、順番に「h」、「e」、「l」、「l」、「o」という文字が代入されます。
for…of文でオブジェクトをループする方法
for…of
文ではオブジェクトをループすることはできません。
しかし、Object.keys
メソッド、Object.values
メソッド、またはObject.entries
メソッドを用いれば、for…of
文を利用することができるようになります。
Object.keysメソッドを用いた場合
Object.keysメソッドを用いることで、オブジェクトのキーで構成された配列を作成することができます。この配列に対して、for…of
文を利用します。
const fruits = {
apple: 'りんご',
banana: 'バナナ',
orange: 'オレンジ',
};
// Object.keysメソッドを用いて、オブジェクトのキーで構成された配列
const keysArray = Object.keys(fruits);
console.log(keysArray);
// ログ出力結果
// [ 'apple', 'banana', 'orange' ]
for (const key of keysArray) {
console.log(key, fruits[key]);
}
// ログ出力結果
// apple りんご
// banana バナナ
// orange オレンジ
Object.valuesメソッドを用いた場合
Object.valuesメソッドを用いることで、オブジェクトの値で構成された配列を作成することができます。この配列に対して、for…of
文を利用します。
const fruits = {
apple: 'りんご',
banana: 'バナナ',
orange: 'オレンジ',
};
// Object.valuesメソッドを用いて、オブジェクトの値で構成された配列を作成
const valuesArray = Object.values(fruits);
console.log(valuesArray);
// ログ出力結果
// [ 'りんご', 'バナナ', 'オレンジ' ]
for (const value of valuesArray) {
console.log(value);
}
// ログ出力結果
// りんご
// バナナ
// オレンジ
オブジェクトの値のみが必要な場合には、Object.values
メソッドを用いた方がシンプルなプログラムになります。
Object.entriesメソッドを用いた場合
Object.entriesメソッドを用いることで、オブジェクトのキーと値がペアになった配列を作成することができます。この配列に対して、for…of
文を利用します。
const fruits = {
apple: 'りんご',
banana: 'バナナ',
orange: 'オレンジ',
};
// Object.entriesメソッドを用いて、オブジェクトのキーと値がペアになった配列を作成
const entriesArray = Object.entries(fruits);
console.log(entriesArray);
// ログ出力結果
// [ [ 'apple', 'りんご' ], [ 'banana', 'バナナ' ], [ 'orange', 'オレンジ' ] ]
for (const entry of entriesArray) {
console.log(entry[0], entry[1]);
}
// ログ出力結果
// apple りんご
// banana バナナ
// orange オレンジ
補足
以下のように、配列の分割代入を使うことで、キーと値を変数key
と変数value
に直接代入することもできます。
const fruits = {
apple: 'りんご',
banana: 'バナナ',
orange: 'オレンジ',
};
// Object.entriesメソッドを用いて、オブジェクトのキーと値がペアになった配列を作成
const entriesArray = Object.entries(fruits);
// 配列の分割代入を使うことで、キーと値を変数keyと変数valueに直接代入している。
for (const [key, value] of entriesArray) {
console.log(key, value);
}
// ログ出力結果
// apple りんご
// banana バナナ
// orange オレンジ
for…of文でインデックスがほしい場合
配列の場合、Array.entries
を用いると、インデックスと値のペアに対して、繰り返し処理をすることができるようになります。
const fruits = ['りんご', 'バナナ', 'オレンジ'];
for (const fruit of fruits.entries()) {
console.log(fruit[0], fruit[1]);
}
// ログ出力結果
// 0 りんご
// 1 バナナ
// 2 オレンジ
本記事のまとめ
この記事では『for…of文』について、以下の内容を説明しました。
- for…of文とは
- for…of文のプログラム例
- 配列に対して繰り返し処理をする
- Setオブジェクトに対して繰り返し処理をする
- Mapオブジェクトに対して繰り返し処理をする
- 文字列に対して繰り返し処理をする
- for…of文でオブジェクトをループする方法
- for…of文でインデックスがほしい場合の対応方法
お読み頂きありがとうございました。