[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Hvordan kan jeg gjøre dette ved hjelp av den nye forEach
-metoden i JavaScript? Jeg har prøvd return;
, return false;
og break
. break
krasjer og return
gjør ingenting annet enn å fortsette iterasjonen.
Det er ingen innebygd evne til å bryte
i forEach
. For å avbryte utførelsen må du kaste et unntak av noe slag. f.eks.
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 unntak er ikke veldig pen. En tradisjonell for
løkke kan være mer hensiktsmessig hvis du virkelig trenger å break
inne i den.
Array#some
Bruk i stedet Array#some
:
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
Dette fungerer fordi some
returnerer true
så snart noen av callbacks, utført i array-rekkefølge, returnerer true
, og kortslutter utførelsen av resten.
some
, dens inverse every
(som vil stoppe ved return false
), og forEach
er alle ECMAScript Fifth Edition-metoder som må legges til Array.prototype
i nettlesere der de mangler.
Vurder å bruke jquery
each
-metoden, siden den gjør det mulig å returnere false i callback-funksjonen:
$.each(function(e, i) {
if (i % 2) return false;
console.log(e)
})
Lodash-bibliotekene tilbyr også takeWhile
-metoden som kan lenkes med map/reduce/fold osv:
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');
// => []
Fant denne løsningen på et annet nettsted. Du kan pakke inn forEach i et try / catch-scenario.
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; }
Flere detaljer her: http://dean.edwards.name/weblog/2006/07/enum/