Connaissez-vous une bibliothèque JavaScript qui implémente une classe générique Iterator pour les collections (que ce soit des tableaux ou un résumé Enumerable) avec un ensemble complet de fonctionnalités, telles que Google Common ou Apache Commons?JavaScript Iterator Class
Modifier: Enumerable#each
n'est pas une classe Iterator. Je suis à la recherche d'un Iterator, ce qui nous permettrait d'écrire quelque chose comme:
var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
Edit: Mamoo nous a rappelé la mise en œuvre itérateur Mozilla's Javascript 1.7. L'objectif est maintenant de trouver une implémentation de cette fonction Iterator dans Javascript 1.5 (ECMA 4).
Édition2: Pourquoi utiliser un itérateur lorsque les bibliothèques (et ECMA 5) fournissent une méthode each
? Tout d'abord, parce que each
est généralement en désordre avec this
car le rappel est call
-ed (c'est pourquoi each
accepte un second argument dans Prototype). Puis, parce que les gens sont beaucoup plus familiers avec la construction for(;;)
qu'avec la construction .each(callback)
(au moins, dans mon domaine). Enfin, parce qu'un itérateur peut parcourir des objets simples (voir JavaScript 1.7).
Edit3: J'ai accepté le anwser de npup, mais voici mon coup à elle:
function Iterator(o, keysOnly) {
if (!(this instanceof arguments.callee))
return new arguments.callee(o, keysOnly);
var index = 0, keys = [];
if (!o || typeof o != "object") return;
if ('splice' in o && 'join' in o) {
while(keys.length < o.length) keys.push(keys.length);
} else {
for (p in o) if (o.hasOwnProperty(p)) keys.push(p);
}
this.next = function next() {
if (index < keys.length) {
var key = keys[index++];
return keysOnly ? key : [key, o[key]];
} else throw { name: "StopIteration" };
};
this.hasNext = function hasNext() {
return index < keys.length;
};
}
var lang = { name: 'JavaScript', birthYear: 1995 };
var it = Iterator(lang);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
Bien sûr, c'est pourquoi nous avons attendu 15 ans pour l'avoir inclus dans la langue. – Alsciende
@stereofrog, de nombreuses librairies et scripts utilisent aujourd'hui des appels de fonctions asynchrones (enfin, jusqu'à ce que WebWorkers soient généralement supportés, mais encore) et pour l'instant, comment suppose-t-on d'itérer de manière asynchrone (de manière non bloquante) Une fonction .each() ou une instruction "for in"? Les itérateurs sont la meilleure solution. ils peuvent être passés à travers des fonctions asynchrones pour reprendre les itérations facilement et indépendamment de l'implémentation sous-jacente. (C'est le modèle d'itérateur après tout). Javascript n'est pas seulement un langage fonctionnel ... mais même un langage fonctionnel * do * a des itérateurs ... –
Dans l'édition 2, quand vous avez mentionné la méthode 'each' d'ES5, vouliez-vous dire la méthode' .forEach() '? – dcorking