ste*_*ewe 132 javascript iterator 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();
Run Code Online (Sandbox Code Playgroud)
在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();
}
};
}
Run Code Online (Sandbox Code Playgroud)
但是通过存储所有对象键会产生大量开销k
.
Ray*_*nos 230
你想要的是对对象或数组的懒惰迭代.这在ES5中是不可能的(因此在node.js中是不可能的).我们最终会得到这个.
唯一的解决方案是找到一个扩展V8的节点模块来实现迭代器(可能还有生成器).我找不到任何实现.您可以查看spidermonkey源代码,并尝试将其作为V8扩展在C++中编写.
您可以尝试以下操作,但它也会将所有密钥加载到内存中
Object.keys(o).forEach(function(key) {
var val = o[key];
logic();
});
Run Code Online (Sandbox Code Playgroud)
然而,由于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);
});
Run Code Online (Sandbox Code Playgroud)
ama*_*sta 22
还要记住,您可以将第二个参数传递给.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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
260064 次 |
最近记录: |