JavaScriptではご存知のように配列などを順々に処理していくのに forEach関数 が使えます。
ただこの forEach で問題なのは途中で処理を止める break みたいなことができないことなんですよね・・・
そこでbreakの代わりになるコードを紹介します。
forEachのおさらい
forEachの使われるのは例えば次のようなコード
1 2 3 4 |
let arr = ['A', 'B' ,'C', 'D', 'E', 'F']; arr.forEach(function(x){ console.log(x); }); |
この例のように配列の内容を全て関数内で処理するみたいな使われ方がされます。
ただforEachと名前がついているもののこれはただの関数なので当然 break とか continue は使えません。
だからもし途中で continue したい場合は次のように途中で return; する必要あり
1 2 3 4 5 |
let arr = ['A', 'B' ,'C', 'D', 'E', 'F']; arr.forEach(function(x){ if( x === 'D' ){ return; } console.log(x); }); |
このコードだと配列の要素が 'D' の場合だけ処理が飛ばせます。
じゃあ continue break もこれと同じ方法でできるかな?、と思ってしまうんですが実は forEach ではどうやってもそれはできません。
いくら return false; とか return true; とか書いたとしても無意味です。
ならどうするかというと次で説明するように some関数 と呼ばれるものを使うと上手くいきます。
some関数を代わりに使う
some関数は真の値(true)が返されるまでずっと処理し続ける関数のことです。
つまり処理を中断したいところで true を返してやれば break のように使えるわけです。
例えば次がそのコード例
1 2 3 4 5 |
let arr = ['A', 'B' ,'C', 'D', 'E', 'F']; arr.some(function(x){ if( x == 'D' ){ return true; } console.log(x); }); |
こうすれば要素が 'D' になった瞬間に処理が止まります。
ちなみにsome関数で continue する方法は次のようにforEachの時と全く同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** some内でcontinueする例 */ let arr = ['A', 'B' ,'C', 'D', 'E', 'F']; arr.some(function(x){ if( x == 'D' ){ return; } console.log(x); }); /** あるいは次のように return false; でもOK */ let arr = ['A', 'B' ,'C', 'D', 'E', 'F']; arr.some(function(x){ if( x == 'D' ){ return false; } console.log(x); }); |
返り値がtrueになったときだけ処理が中断するのでそれ以外の return false; か return; で返せばいいという訳です。
ここまでのまとめ
ここまでのことをまとめると次の通り
- forEach内ではどうやっても continue; できない
- だからsome関数で return true; とすればOK
こういうことです。
分かってしまうと簡単だけど知らないと悩んでしまいますよね。ではまた($・・)/~~~