Od Javascript 1.7 istnieje obiekt Iterator , który umożliwia to:
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();
czy jest coś takiego w node.js?
W tej chwili używam:
function Iterator(o){
/*var k=[];
for(var i in o){
k.push(i);
}*/
var k=Object.keys(o);
return {
next:function(){
return k.shift();
}
};
}
ale to generuje dużo narzutów, przechowując wszystkie klucze obiektów w k
.
javascript
node.js
iterator
gulasz
źródło
źródło
createNodeIterator
to, że dotyczy elementów DOM, nie mam nawet DOM;) @ c69: przechowuję wszystkie dane wkeys
obiekcie ivalue
jest po prostu ustawione na1
(około 20 MB w kluczach 700k), rzeczywiście, dla teraz po prostu ignoruję to „narzut”, ale wolałbym lepsze rozwiązanie :)Odpowiedzi:
To, czego chcesz, to leniwa iteracja po obiekcie lub tablicy. Nie jest to możliwe w ES5 (a więc nie jest możliwe w node.js). W końcu to dostaniemy.
Jedynym rozwiązaniem jest znalezienie modułu węzła, który rozszerza V8 o implementację iteratorów (i prawdopodobnie generatorów). Nie mogłem znaleźć żadnej realizacji. Możesz spojrzeć na kod źródłowy spidermonkey i spróbować napisać go w C ++ jako rozszerzenie V8.
Możesz spróbować wykonać następujące czynności, jednak spowoduje to również załadowanie wszystkich kluczy do pamięci
Jednak ponieważ
Object.keys
jest to metoda natywna, może pozwolić na lepszą optymalizację.Reper
Jak widać Object.keys jest znacznie szybsze. To, czy rzeczywista pamięć jest bardziej optymalna, to inna sprawa.
źródło
forEach
ponieważ każdy krok iteracji powinien być wywoływany z asyncsetTimeout
.async.forEach
Pamiętaj również, że możesz przekazać drugi argument do
.forEach()
funkcji określającej obiekt, który ma być użyty jakothis
słowo kluczowe.źródło
Object.keys(myObject).forEach(function(key, index, arrayOfKeys) {
W przypadku prostej iteracji klucza / wartości czasami biblioteki, takie jak underscorejs, mogą być Twoim przyjacielem.
tylko w celach informacyjnych
źródło
underscorejs
. Użyłem tej funkcji zlodash
biblioteki.Jestem nowy w node.js (około 2 tygodnie), ale właśnie utworzyłem moduł, który rekurencyjnie raportuje do konsoli zawartość obiektu. Wyświetli listę wszystkich lub wyszuka konkretny element, a następnie przejdzie do określonej głębokości, jeśli zajdzie taka potrzeba.
Być może możesz to dostosować do swoich potrzeb. Nie komplikuj! Po co komplikować? ...
źródło
dostosuj jego kod:
źródło