概要
配列に対して、全ての要素に順にアクセスする方法を試してみます。
別な言い方をすればイテレータ(反復子とも言います)についての挙動を実際に試します。
forループによるアクセス
実際に次のようなコードを書いて、配列の全ての要素に対して出力を行ってみます。
let test1 = [1, 10, 20, 30, 60, 90]; for (var i = 0; i < test1.length; i++) { console.log(test1[i]); }
上記のコードは単純に配列の全ての要素にアクセスしています。
出力結果は次のようになります。
1 10 20 30 60 90
では、この配列が、途中で値が存在しない場合の配列の場合を試してみます。
配列の3つめ5つめをnullにしてあります。
let test2 = [1, 10, , 30, , 90]; for (var i = 0; i < test2.length; i++) { console.log(test2[i]); }
上記の場合の出力結果は次のようになります。
1 10 undefined 30 undefined 90
ループ処理の3番目と5番目の要素にアクセスする際、配列の要素がないので「undefined」として結果が出力されます。
上記のことから、ループ処理でイテレータの実行する時は、配列の要素が全て存在する場合か、または存在することをチェックするプログラムを書く必要があります。
例えば次のように書くことで配列の要素が存在しない場合はループをスキップすることが可能です。
let test3 = [1, 10, , 30, , 90]; for (var i = 0; i < test3.length; i++) { if (test3[i]) { console.log(test3[i]); } }
上記のコードの場合は、配列の要素が存在する場合のみtrueと判定されるので、次のような出力結果になります。
1 10 30 90
if文での判定を行う際に、要件仕様によってcontinue等を使って処理をスキップする場合も有用です。
for in によるアクセス
上記のような配列に対して、for文と同じようにアクセスする構文として「for in」という構文があります。
これも同様に動きを試してみます。
次のようなコードを書きます。
let test4 = [1, 10, , 30, , 90]; for (var index in test4) { console.log(test4[index]); }
出力結果は次のようになります。
1 10 30 90
for in構文の場合、値が空白やnull、undefinedの要素にはアクセスせず、次の要素にアクセスします。
for in構文で注意が必要なのは、動作するブラウザ環境により、処理される順番が担保されないという点です。(降順/昇順などがバラバラになる)
順番を重視する要件の場合にはfor 文を使ったほうが無難と言えます。
forEach()メソッド によるアクセス
では次にforEach()メソッドを使った場合について動作を確認してみます。
次のようなコードを書いて実行してみます。
let test5 = [1, 10, , 30, , 90]; test5.forEach(function(x) { console.log(x); });
上記の出力結果は次のようになります。
1 10 30 90
このメソッドを使った場合も、存在しない要素については処理されず、値が存在する要素を処理しています。
また、for inメソッドとの大きな違いは、処理される順番がインデックス順になる。という点です。
上記のような書き方はjavascriptの関数型プログラムに発展することができ、それはまた別な投稿で取り上げたいと思います。