Lyhyt piiri Array.forEach kuten kutsuminen break

[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.

Ratkaisu

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ä.

Käytä 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.

Kommentit (14)

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');
// => []
Kommentit (3)

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/

Kommentit (1)