从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。
k
您想要的是对象或数组上的延迟迭代。这在ES5中是不可能的(因此在node.js中是不可能的)。我们最终会得到这个。
唯一的解决方案是找到一个扩展V8的节点模块,以实现迭代器(可能还有生成器)。我找不到任何实现。您可以查看Spidermonkey源代码,并尝试使用C ++作为V8扩展来编写它。
您可以尝试以下操作,但是也会将所有密钥加载到内存中
Object.keys(o).forEach(function(key) { var val = o[key]; logic(); });
但是,由于这Object.keys是一种本地方法,因此可能会带来更好的优化。
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); });