配列を走査するときに、途中でループを抜けるには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かどうか===で評価されているので、間違ってループを抜けてしまうことはまずなさそうです。相変わらず良く考えられています。