遍历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