1. ホーム
  2. javascript

[解決済み] node.jsでオブジェクトのキーに繰り返しアクセスする

2022-05-31 12:11:37

質問

Javascript 1.7以降では イテレータ オブジェクトがあり、これを利用することができます。

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();

は、node.jsにこのようなものがあるのでしょうか?

今、使っているのは

function Iterator(o){
    /*var k=[];
    for(var i in o){
        k.push(i);
    }*/
    var k=Object.keys(o);
    return {
        next:function(){
            return k.shift();
        }
    };
}

にオブジェクトのキーを格納することで、多くのオーバーヘッドを生み出します。 k .

どのように解決するのですか?

オブジェクトや配列に対する遅延反復処理を行いたい。これはES5では不可能です(したがって、node.jsでは不可能です)。いずれはこれを実現する予定です。

唯一の解決策は、V8を拡張してイテレータ(とおそらくジェネレータ)を実装するnodeモジュールを見つけることです。私はどんな実装も見つけることができませんでした。spidermonkey のソースコードを見て、V8 拡張として C++ で書いてみるとよいでしょう。

次のようにすることもできますが、これはすべてのキーをメモリにロードすることになります。

Object.keys(o).forEach(function(key) {
  var val = o[key];
  logic();
});

しかし Object.keys はネイティブメソッドであるため、より良い最適化ができるかもしれません。

ベンチマーク

ご覧の通り、Object.keysは大幅に高速化されています。実際のメモリストレージがより最適化されているかどうかは別問題です。

var async = {};
async.forEach = function(o, cb) {
  var counter = 0,
    keys = Object.keys(o),
    len = keys.length;
  var next = function() {
    if (counter < len) cb(o[keys[counter++]], next);
  };
  next();
};

async.forEach(obj, function(val, next) {
  // do things
  setTimeout(next, 100);
});