遍历node.js中的对象键

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

}

};

}

但这通过将所有对象密钥存储在中而产生大量开销k

回答:

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

唯一的解决方案是找到一个扩展V8的节点模块,以实现迭代器(可能还有生成器)。我找不到任何实现。您可以查看Spidermonkey源代码,并尝试使用C

++作为V8扩展来编写它。

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

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

});

以上是 遍历node.js中的对象键 的全部内容, 来源链接: utcz.com/qa/406276.html

回到顶部