Βραχυκύκλωμα Array.forEach όπως η κλήση break

[1,2,3].forEach(function(el) {
    if(el === 1) break;
});

Πώς μπορώ να το κάνω αυτό χρησιμοποιώντας τη νέα μέθοδο forEach στη JavaScript; Δοκίμασα το return;, το return false; και το break. Το break καταρρέει και το return δεν κάνει τίποτα άλλο από το να συνεχίσει την επανάληψη.

Λύση

Δεν υπάρχει ενσωματωμένη δυνατότητα "σπασίματος" στο forEach. Για να διακόψετε την εκτέλεση θα πρέπει να πετάξετε μια εξαίρεση κάποιου είδους. π.χ.

Σχόλια (14)

Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε τη μέθοδο jquery's each, καθώς επιτρέπει να επιστρέψετε false μέσα στη συνάρτηση callback:

$.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');
// => []
Σχόλια (3)

Βρήκα αυτή τη λύση σε έναν άλλο ιστότοπο. Μπορείτε να τυλίξετε το forEach σε ένα σενάριο try / catch.

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; }

Περισσότερες λεπτομέρειες εδώ: http://dean.edwards.name/weblog/2006/07/enum/

Σχόλια (1)