JavaScriptにおけるforEach()の利用方法
本ページではJavaScriptで Array オブジェクトに対して利用することができる forEach() の利用方法について説明します。
forEach とは?#
forEach() は Array (配列) オブジェクトで利用可能な関数であり、 Array 内のすべての要素に対して何かしらの処理を実施したい時に利用するものです。各要素は昇順(配列の前の要素から順番)で呼び出されます。
通常の for ループを関数呼び出しの形にしたもの、とイメージしておけば問題ありません。
forループを関数型プログラミング的に記述ができる、という言い方もできます。
forEach の具体例と for 文との比較#
forEach の簡単な例を示します。以下の例は配列内のすべての要素をコンソール出力するものです。
/* forEach を利用した場合 */
const testArray1 = [1, 2, 3, 4];
testArray1.forEach((elem) => {
console.log(elem);
})
/* for で書いた場合 */
for (var i = 0; i < testArray1.length; i++) {
console.log(testArray1[i]);
}
上記では アロー関数式 と呼ばれる機能を利用しています。アロー関数式は通常の関数を簡略的に表記したもの[1] で、関数を別枠で定義した場合には以下のようになります。このコードは上記のものと同じ動作をします。
const PrintElement = function (elem) {
console.log(elem);
}
const testArray2 = [1, 2, 3, 4];
testArray2.forEach(PrintElement)
または、通常の関数記述形式を forEach() の中にそのまま入れることも可能です。
const testArray3 = [1, 2, 3, 4];
testArray3.forEach(function (elem) {
console.log(elem);
})
次の例では文字列データから構成される配列内のすべてに対して文字列の置き換え (スラッシュをハイフンへ) を実施しています。
/* forEach を利用した場合 */
const testArray4 = ['2022/01/01', '2022/02/01', '2022/03/01'];
const replacedArray = []
testArray4.forEach((elem) => {
replacedArray.push(elem.replaceAll('/', '-'));
});
console.log(replacedArray);
// => ['2022-01-01', '2022-02-01', '2022-03-01']
/* for で書いた場合 */
const replacedArrayFor = []
for (var i = 0; i < testArray4.length; i++) {
replacedArrayFor.push(testArra4[i].replaceAll('/', '-'));
}
console.log(replacedArrayFor);
// => ['2022-01-01', '2022-02-01', '2022-03-01']
for に対する forEach の利点#
上記のサンプルコードをから見て取れる通り、 forEach を使うことで for よりも次のような利点を享受できます。
index 用の変数を宣言する必要がない
ループ範囲を自分で指定する必要がない
配列の各要素が初めから変数として取り出されているのでコードの可読性が高い
for に対する forEach の欠点#
欠点というほどではないのですが、 forEach は Array で定義されている関数であるため、配列にしか用いることができません。
length プロパティを持つようないわゆる「配列のようなオブジェクト」に対しては for ( ... in ... ) 形式のfor文を利用することで似たような使用感でforループを記述することができます。
forEach 利用方法#
forEach の書式は以下の通りです。
forEach(callbackFn, thisArg)
名称 | 意味 |
---|---|
calbackFn | 配列の各要素に対して呼び出す関数を指定します |
thisArg | callbackFn 内部で this として扱われる変数を指定します |
ここで指定される calbackFn については以下の通りです。
callbackFn(element, index, array)
名称 | 意味 |
---|---|
element | 配列の各要素が格納されます |
index | element のインデックス番号が格納されます |
array | forEach() を呼び出している配列そのものが格納されます |
具体例#
const exampleArray = [1, 2, 3, 4, 5]
exampleArray.forEach((element, index, array) => {
if (index == 0) {
console.log(`array : ${array}`);
console.log(`this : ${this}`);
}
console.log(`element #${index} -> ${element}`);
})
出力は以下のようになります (Node 18.7.0 の場合)
array : 1,2,3,4,5
this : [object global]
element #0 -> 1
element #1 -> 2
element #2 -> 3
element #3 -> 4
element #4 -> 5
thisArg を指定していないため、そのまま forEach() の外側で参照可能な this の値が出力されています。
注意点#
forEach() に関する注意点です。
forEach() は途中で処理を強制終了することができません。 ( for における break のようなことはできない)
ただし、ループ内部で例外を発生させることで強制終了することは可能です。
forEach() 内部で非同期関数を処理することはできません。
エラーが発生するわけではないですが、 await を利用したとしても非同期関数を待たないため、期待した結果を得られない可能性があります。
初期化されていない値 ( empty ) に対しては処理がスキップされます。
forEach() 内で配列の要素を追加・削除すると処理が分りづらくなる可能性があるため推奨されません。
関連記事