迭代node.js中的对象键 [英] Iterate over object keys in node.js

查看:109
本文介绍了迭代node.js中的对象键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

自Javascript 1.7起,有一个 Iterator 对象,允许这样做:

Since Javascript 1.7 there is an Iterator object, which allows this:

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中是这样的吗?

is there something like this in 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();
        }
    };
}

但是通过将所有对象键存储在<$中会产生大量开销c $ c> k 。

but that produces a lot of overhead by storing all the object keys in k.

推荐答案

您想要的是对对象或数组进行延迟迭代。这在ES5中是不可能的(因此在node.js中是不可能的)。我们最终会得到这个。

What you want is lazy iteration over an object or array. This is not possible in ES5 (thus not possible in node.js). We will get this eventually.

唯一的解决方案是找到一个扩展V8的节点模块来实现迭代器(可能还有生成器)。我找不到任何实现。您可以查看spidermonkey源代码并尝试将其作为V8扩展在C ++中编写。

The only solution is finding a node module that extends V8 to implement iterators (and probably generators). I couldn't find any implementation. You can look at the spidermonkey source code and try writing it in C++ as a V8 extension.

您可以尝试以下操作,但它也会将所有密钥加载到内存中

You could try the following, however it will also load all the keys into memory

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

但是因为 Object.keys 是原生的方法可以允许更好的优化。

However since Object.keys is a native method it may allow for better optimisation.

基准

正如您所见,Object.keys明显更快。实际内存存储是否更优化是另一回事。

As you can see Object.keys is significantly faster. Whether the actual memory storage is more optimum is a different matter.

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

这篇关于迭代node.js中的对象键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆