Depuis Javascript 1.7, il existe un objet Iterator , qui permet ceci:
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();
y a-t-il quelque chose comme ça dans node.js?
En ce moment, j'utilise:
function Iterator(o){
/*var k=[];
for(var i in o){
k.push(i);
}*/
var k=Object.keys(o);
return {
next:function(){
return k.shift();
}
};
}
mais cela produit beaucoup de surcharge en stockant toutes les clés d'objet dans k
.
javascript
node.js
iterator
ragoût
la source
la source
createNodeIterator
soit pour les éléments DOM, je n'ai même pas de DOM;) @ c69: je stocke toutes les données dans lekeys
de l'objet et levalue
est juste réglé sur1
(environ 20 Mo dans 700k clés), en effet, pour maintenant, j'ignore simplement cette «surcharge», mais je préférerais une meilleure solution :)Réponses:
Ce que vous voulez, c'est une itération paresseuse sur un objet ou un tableau. Ce n'est pas possible dans ES5 (donc pas possible dans node.js). Nous finirons par y arriver.
La seule solution est de trouver un module de nœud qui étend V8 pour implémenter des itérateurs (et probablement des générateurs). Je n'ai trouvé aucune implémentation. Vous pouvez consulter le code source de spidermonkey et essayer de l'écrire en C ++ en tant qu'extension V8.
Vous pouvez essayer ce qui suit, mais cela chargera également toutes les clés en mémoire
Cependant, comme il
Object.keys
s'agit d'une méthode native, cela peut permettre une meilleure optimisation.Référence
Comme vous pouvez le voir, Object.keys est nettement plus rapide. Que le stockage réel de la mémoire soit plus optimal est une autre question.
la source
forEach
puisque chaque étape d'itération doit être invoquée à partir d' un asyncsetTimeout
.async.forEach
N'oubliez pas également que vous pouvez passer un deuxième argument à la
.forEach()
fonction en spécifiant l'objet à utiliser commethis
mot - clé.la source
Object.keys(myObject).forEach(function(key, index, arrayOfKeys) {
Pour une itération simple des clés / valeurs, des bibliothèques comme les underscorejs peuvent parfois être votre ami.
Juste pour référence
la source
underscorejs
. J'ai utilisé cette fonction de lalodash
bibliothèque.Je suis nouveau sur node.js (environ 2 semaines), mais je viens de créer un module qui rapporte de manière récursive à la console le contenu d'un objet. Il listera tout ou recherchera un élément spécifique, puis explorera d'une profondeur donnée si nécessaire.
Vous pouvez peut-être le personnaliser en fonction de vos besoins. Rester simple! Pourquoi compliquer? ...
la source
ajuster son code:
la source