[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Miten voin tehdä tämän käyttämällä uutta forEach
-metodia JavaScriptissä? Olen kokeillut return;
, return false;
ja break
. break
kaatuu ja return
ei tee mitään muuta kuin jatkaa iteraatiota.
forEach
-ohjelmassa ei ole sisäänrakennettua kykyä break
:iin. Keskeyttääksesi suorituksen sinun pitäisi heittää jonkinlainen poikkeus. esim.
var BreakException = {};
try {
[1, 2, 3].forEach(function(el) {
console.log(el);
if (el === 2) throw BreakException;
});
} catch (e) {
if (e !== BreakException) throw e;
}
JavaScriptin poikkeukset eivät ole kauhean kauniita. Perinteinen for
-silmukka voisi olla sopivampi, jos todella haluat break
sen sisällä.
Array#some
Käytä sen sijaan Array#some
:
[1, 2, 3].some(function(el) {
console.log(el);
return el === 2;
});
Tämä toimii, koska some
palauttaa true
heti, kun jokin array-järjestyksessä suoritettavista callbackeista palauttaa true
, jolloin loput suoritetaan oikosulussa.
some
, sen käänteismetodi every
(joka pysähtyy, kun palautuu false
) ja forEach
ovat kaikki ECMAScript Fifth Editionin metodeja, jotka on lisättävä Array.prototype
:iin selaimissa, joissa ne puuttuvat.
Harkitse jquery
'n each
-metodin käyttöä, koska sen avulla voit palauttaa väärän arvon callback-funktion sisällä:
$.each(function(e, i) {
if (i % 2) return false;
console.log(e)
})
Lodash-kirjastot tarjoavat myös [takeWhile
]-metodin1, joka voidaan ketjuttaa map/reduce/fold jne. kanssa:
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');
// => []
Löysin tämän ratkaisun toiselta sivustolta. Voit kietoa forEachin try/ catch-skenaarioon.
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; }
Lisätietoja täältä: http://dean.edwards.name/weblog/2006/07/enum/