Desde Javascript 1.7 hay un objeto Iterator , que permite esto:
var a={a:1,b:2,c:3};
var it=Iterator(a);
function iterate(){
try {
console.log(it.next());
setTimeout(iterate,1000);
}catch (err if err instanceof StopIteration) {
console.log("End of record.\n");
} catch (err) {
console.log("Unknown error: " + err.description + "\n");
}
}
iterate();
¿hay algo como esto en node.js?
En este momento estoy usando:
function Iterator(o){
/*var k=[];
for(var i in o){
k.push(i);
}*/
var k=Object.keys(o);
return {
next:function(){
return k.shift();
}
};
}
pero eso genera muchos gastos generales al almacenar todas las claves de objeto k
.
javascript
node.js
iterator
stewe
fuente
fuente
createNodeIterator
es para elementos DOM, ni siquiera tengo un DOM;) @ c69: almaceno todos los datos enkeys
el objeto yvalue
simplemente se establece en1
(aproximadamente 20 MB en 700k claves), de hecho, para ahora solo estoy ignorando esta 'sobrecarga', pero preferiría una mejor solución :)Respuestas:
Lo que quieres es una iteración perezosa sobre un objeto o matriz. Esto no es posible en ES5 (por lo tanto, no es posible en node.js). Obtendremos esto eventualmente.
La única solución es encontrar un módulo de nodo que extienda V8 para implementar iteradores (y probablemente generadores). No pude encontrar ninguna implementación. Puede mirar el código fuente de spidermonkey e intentar escribirlo en C ++ como una extensión V8.
Puede intentar lo siguiente, sin embargo, también cargará todas las claves en la memoria
Sin embargo, dado que
Object.keys
es un método nativo, puede permitir una mejor optimización.Punto de referencia
Como puede ver Object.keys es significativamente más rápido. Si el almacenamiento de memoria real es más óptimo es una cuestión diferente.
fuente
forEach
ya que cada paso de la iteración debe ser invocado desde un asíncronosetTimeout
.async.forEach
Recuerde también que puede pasar un segundo argumento a la
.forEach()
función que especifica el objeto para usar comothis
palabra clave.fuente
Object.keys(myObject).forEach(function(key, index, arrayOfKeys) {
Para una simple iteración de clave / valores, a veces las bibliotecas como underscorejs pueden ser su amigo.
solo para referencia
fuente
underscorejs
. Usé esta función de lalodash
biblioteca.Soy nuevo en node.js (aproximadamente 2 semanas), pero acabo de crear un módulo que informa recursivamente a la consola el contenido de un objeto. Enumerará todo o buscará un artículo específico y luego profundizará por una profundidad dada si es necesario.
Quizás pueda personalizar esto para satisfacer sus necesidades. ¡Mantenlo simple! ¿Por qué complicarse? ...
fuente
ajustar su código:
fuente