[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Wie kann ich dies mit der neuen Methode "forEach" in JavaScript erreichen? Ich habe return
, return false
und break
ausprobiert. break
stürzt ab und return
macht nichts, sondern setzt die Iteration fort.
Es gibt keine eingebaute Möglichkeit, in "forEach" zu unterbrechen. Um die Ausführung zu unterbrechen, müssen Sie eine Ausnahme auslösen. z.B..
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-Ausnahmen sind nicht sonderlich hübsch. Eine herkömmliche "for"-Schleife ist vielleicht besser geeignet, wenn man darin wirklich "brechen" muss.
Array#some
Verwenden Sie stattdessen Array#some
:
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
Das funktioniert, weil some
true
zurückgibt, sobald einer der Rückrufe, die in Array-Reihenfolge ausgeführt werden, true
zurückgibt und damit die Ausführung der anderen kurzschließt.
some
, seine Umkehrung every
(die bei einem return false
aufhört), und forEach
sind alle ECMAScript Fifth Edition Methoden, die dem Array.prototype
auf Browsern hinzugefügt werden müssen, wo sie fehlen.
Erwägen Sie die Verwendung der each
-Methode von jquery
, da sie es erlaubt, innerhalb der Callback-Funktion false zurückzugeben:
$.each(function(e, i) {
if (i % 2) return false;
console.log(e)
})
Die Lodash-Bibliotheken bieten auch die Methode takeWhile
, die mit map/reduce/fold etc. verkettet werden kann:
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');
// => []
Ich habe diese Lösung auf einer anderen Website gefunden. Sie können die forEach in einem try / catch-Szenario wickeln.
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; }
Mehr Details hier: http://dean.edwards.name/weblog/2006/07/enum/