[1,2,3].forEach(function(el) {
if(el === 1) break;
});
JavaScriptの新しいforEach
メソッドを使ってどのようにすればよいのでしょうか?私は return;
, return false;
, break
を試しました。break "はクラッシュし、"return "は反復を続けるだけで何もしません。
forEachには、
break`する機能は組み込まれていません。実行を中断するには、ある種の例外を投げなければなりません。
var BreakException = {};
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw BreakException;
});
} catch (e) {
if (e !== BreakException) throw e;
}
<! -- スニペットの終了 -->
JavaScript の例外はあまりきれいではありません。その中で本当に break
する必要があるなら、伝統的な for
ループの方が適切かもしれません。
代わりに、Array#some`を使用します。
<! -- begin snippet: js hide: false console: true babel: false -->
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
<! -- スニペットの終了 -->
これは、配列順に実行されたコールバックのいずれかが true
を返すと同時に some
が true
を返し、残りのコールバックの実行を短絡させることで動作します。
some、その逆の [
every][2] (これは
return falseで停止します)、および
forEachはすべて ECMAScript Fifth Edition のメソッドであり、これらが欠けているブラウザでは
Array.prototype` に追加する必要があります。
jqueryの
each`メソッドは、コールバック関数内でfalseを返すことができるので、その使用を検討してください。
$.each(function(e, i) {
if (i % 2) return false;
console.log(e)
})
LodashのライブラリにはtakeWhile`というメソッドがあり、map/reduce/foldなどとチェインすることができます。
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.takeWhile(users, function(o) { return !o.active; });
// => objects for ['barney', 'fred']
// The `_.matches` iteratee shorthand.
_.takeWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.takeWhile(users, ['active', false]);
// => objects for ['barney', 'fred']
// The `_.property` iteratee shorthand.
_.takeWhile(users, 'active');
// => []
他のサイトでこの解決策を見つけました。try / catchシナリオでforEachを包むことができます。
if(typeof StopIteration == "undefined") {
StopIteration = new Error("StopIteration");
}
try {
[1,2,3].forEach(function(el){
alert(el);
if(el === 1) throw StopIteration;
});
} catch(error) { if(error != StopIteration) throw error; }