配列を走査するときに、途中でループを抜けるにはsomeが使える
LDRize.Opera用に、some相当の関数を書いていて気がついたことをメモメモ。
配列を走査する際に、目的の値を見つけたらそこでループを抜けたい場合というのは良くあるケースだと思います。普通にfor文などで回す場合は、breakを使うのが一般的です。ただ、forEachではbreakは使えません。
[1,2,3,4,5].forEach(function(v,i){ console.log(v,i); if ( v > 2) ;//break? }); /* 1 0 2 1 3 2 ←ここで止めたい 4 3 5 4 */
そういったときはArray#some(Array#everyでも可)が使えます。
[1,2,3,4,5].some(function(v,i){ console.log(v,i); return v > 2; }); /* 1 0 2 1 3 2 */
このとき、当然someはtrueを返します。
IEなどで使えるsome相当の関数は下記のような感じです。
function some(arr,f,o){ for (var i=0,l=arr.length,r=[];i<l;++i) if(f.call(o,arr[i],i,arr)) return true; return false; }
なお、厳密なsomeの実装は、some | MDNをどうぞ。
余談ですが、jQueryのeach関数はreturn falseするとループを抜けられるようになっているそうです。
each関数(forEachなど)は値を返さないですし、うっかりreturnしてしまってもfalseかどうか===で評価されているので、間違ってループを抜けてしまうことはまずなさそうです。相変わらず良く考えられています。