如何遍历node.js中的对象键?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

由于Javascript 1.7有一个Iterator对象,它允许这样做:

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

但是通过将所有对象键存储在其中会产生很多代价。

提问于
用户回答回答于

想要的是对对象或数组的惰性迭代。这在ES5中是不可能的(因此在node.js中不可能)。

唯一的解决方案是找到一个扩展V8的节点模块来实现迭代器(也可能是生成器)。我找不到任何实施。可以查看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);
});
用户回答回答于

另外请记住,可以将第二个参数传递给.forEach()指定要用作this关键字的对象的函数。

// myOjbect is the object you want to iterate.
// Notice the second argument (secondArg) we passed to .forEach.
Object.keys(myObject).forEach(function(element, key, _array) {
  // element is the name of the key.
  // key is just a numerical value for the array
  // _array is the array of all the keys

  // this keyword = secondArg
  this.foo;
  this.bar();
}, secondArg);

扫码关注云+社区

领取腾讯云代金券