JavaScriptで配列の各要素にループ処理を行う方法をまとめました。
- 配列に対するループ処理の記述、動作(for/for of/forEach/map/reduce/filter)
- forEachとmapの動作の違い
- reduceの活用例
ループ処理
for
まずは基本のfor文です。for(①初期化式; ②条件式; ③変化式){④処理} の書式で記載します。
①初期化式はループ開始時に1度だけ実行されます。
②条件式はループ毎に④処理を行う前に毎回判定し、不成立の場合forから抜けます。
③変化式は④処理実行後、次のループ前に毎回実行されます。
主に配列のindexを参照、使用したい場合に使用します。
for of
for of文は配列の各要素を先頭から順番に直接取り出して処理を行います。for( 要素 of 配列){ 処理 } の書式で記述します。
配列.forEach
forEachは配列(Array)オブジェクトに用意されているループ処理です。処理関数を渡すことで各要素を先頭から順番に処理関数に渡して処理を行います。配列.forEach(処理関数) の書式で記述します。
また、forEachに指定する処理関数は第2、第3引数を持つことができます。第2引数は第1引数の要素のインデックス、第3引数は配列本体が渡されます。
引数 => 処理 はアロー関数という関数の記述方法です。詳細は以下の記事を参照してください。
配列.map
mapは配列(Array)オブジェクトに用意されているループ処理です。処理関数を渡すことで各要素を先頭から順番に処理関数に渡して処理を行い、結果を新しい配列として返します。
該当の配列の各要素に対して処理を行う点はforEachと同じですが、処理結果の配列が返却される点が異なります。配列.map(処理関数) の書式で記述します。
また、処理関数はforEachと同様に第2引数でインデックス、第3引数で配列本体を受け取ることができます。
ちなみにmap関数に渡す関数の第二引数には要素のインデックスが入ってきます。関数に第二引数を与えることでインデックスを使用することができます。
配列.reduce
reduceは配列(Array)オブジェクトに用意されているループ処理です。直前のループまでの結果を引き継ぎながら次のループ処理を行います。ループ毎の結果を蓄積して最終的な結果を生成したい場合に使うとよいでしょう。配列.reduce(処理関数) の書式で記述します。
上記の例では、1回目のループのprevに配列の0番目要素(1)、curに1番目要素(2)が設定されてきています。この場合、curに対して処理を行うような関数の場合、最初の要素が処理されないため注意です。(今回は加算するだけなので偶々正しい結果になるだけ)
curに0番目要素(1)を設定するためには、reduce関数の第2引数に初期値を設定します。
↑初期値が最初のprevになり、curに配列の先頭要素がくるようになった。これで全要素が正しく関数で実行されます。
reduce関数は配列のデータからHTMLを作成する場合などに使うと便利です。
例)配列の内容をそれぞれ<div>要素で囲ったHTML要素を作成したい場合:
配列.filter
filterは配列(Array)オブジェクトに用意されている抽出用のループ処理です。filter関数に渡した関数内で各要素について判定し、trueを返した要素だけ抽出した配列を返します。配列.reduce(処理関数) の書式で記述します。なお、判定時に各要素に対して引数で渡した関数が実行されます。
結果より、
- 全ての要素に対して処理が実行されていること
- 関数がtrueを返した要素のみ抽出された新しい配列が生成されていること
が分かります。