¿Conoce una biblioteca de JavaScript que implemente una clase genérica Iterator para colecciones (ya sean matrices o algún enumerativo abstracto) con un conjunto completo de características, como Google Common o Apache Commons?JavaScript Iterator Clase
Editar: Enumerable#each
no es una clase Iterator. Busco un iterador, algo que nos permita escribir algo como:
var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
Editar: Mamoo nos ha recordado la puesta en práctica de iteración de Mozilla's Javascript 1.7. Entonces, el objetivo ahora es encontrar una implementación de esta función Iterator en Javascript 1.5 (ECMA 4).
Edit2: ¿Por qué utilizar un iterador cuando las bibliotecas (y ECMA 5) proporcionan un método each
? En primer lugar, porque each
generalmente entra en conflicto con this
porque la devolución de llamada es call
-ed (es por eso que each
acepta un segundo argumento en Prototype). Entonces, porque las personas están mucho más familiarizadas con el constructo for(;;)
que con el constructo .each(callback)
(al menos, en mi campo). Por último, porque un iterador puede iterar sobre objetos planos (ver JavaScript 1.7).
Edit3: Me aceptó anwser de npup, pero aquí está mi tiro en él:
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
Claro, es por eso que esperamos 15 años para que se incluya en el idioma. – Alsciende
@stereofrog, muchas bibliotecas y scripts actualmente usan llamadas a funciones asincrónicas (bueno, hasta que los WebWorkers sean generalmente compatibles, pero incluso entonces) y de momento, ¿cómo se supone iterar a través de datos de forma asincrónica (de forma no bloqueante) con un simple .each() función o una declaración "para en"? Iteradores son la mejor solución; se pueden pasar a través de funciones asíncronas para reanudar iteraciones fácilmente y sin importar la implementación subyacente. (Este es el patrón de iterador después de todo). Javascript no es solo un lenguaje funcional ... sino que incluso el lenguaje funcional * do * tiene iteradores ... –
En la edición 2, cuando mencionaste el método 'each' de ES5, ¿te refieres al método' .forEach() '? – dcorking