Desde o Javascript 1.7, existe um objeto Iterator , que permite:
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();
existe algo parecido com isto no node.js?
Agora eu estou 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();
}
};
}
mas isso gera muita sobrecarga ao armazenar todas as chaves de objeto k
.
javascript
node.js
iterator
ensopado
fonte
fonte
createNodeIterator
é para elementos DOM, eu nem tenho um DOM;) @ c69: eu armazeno todos os dados nokeys
objeto e ovalue
é apenas definido como1
(cerca de 20 MB em chaves de 700k), de fato, para agora eu só estou ignorando esse 'sobrecarga', mas eu preferiria uma solução melhor :)Respostas:
O que você deseja é uma iteração lenta sobre um objeto ou matriz. Isso não é possível no ES5 (portanto, não é possível no node.js). Nós vamos conseguir isso eventualmente.
A única solução é encontrar um módulo de nó que estenda a V8 para implementar iteradores (e provavelmente geradores). Não encontrei nenhuma implementação. Você pode olhar o código-fonte spidermonkey e tentar escrevê-lo em C ++ como uma extensão V8.
Você pode tentar o seguinte, no entanto, também carregará todas as chaves na memória
No entanto, como
Object.keys
é um método nativo, ele pode permitir uma melhor otimização.Referência
Como você pode ver, Object.keys é significativamente mais rápido. Se o armazenamento real da memória é mais otimizado é uma questão diferente.
fonte
forEach
uma vez que cada passo iteração deve ser chamado a partir de um assíncronosetTimeout
.async.forEach
Lembre-se também de que você pode passar um segundo argumento para a
.forEach()
função que especifica o objeto a ser usado comothis
palavra - chave.fonte
Object.keys(myObject).forEach(function(key, index, arrayOfKeys) {
Para uma iteração simples de chave / valores, às vezes bibliotecas como underscorejs podem ser seus amigos.
Somente para referência
fonte
underscorejs
. Eu usei essa função dalodash
biblioteca.Eu sou novo no node.js (cerca de 2 semanas), mas acabei de criar um módulo que reporta recursivamente ao console o conteúdo de um objeto. Ele listará tudo ou procurará um item específico e, em seguida, detalhará uma profundidade específica, se necessário.
Talvez você possa personalizar isso para atender às suas necessidades. Mantenha simples! Por que complicar? ...
fonte
ajuste o código dele:
fonte