首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在node.js中迭代对象键

在node.js中迭代对象键
EN

Stack Overflow用户
提问于 2011-09-16 12:00:07
回答 5查看 310.2K关注 0票数 150

从Javascript1.7开始,有一个Iterator对象,它允许:

代码语言:javascript
复制
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中有这样的东西吗?

现在我使用的是:

代码语言:javascript
复制
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中,这会产生大量开销。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-16 16:28:57

您需要的是对象或数组上的惰性迭代。这在ES5中是不可能的(因此在node.js中是不可能的)。我们最终会得到这一点。

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

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

代码语言:javascript
复制
Object.keys(o).forEach(function(key) {
  var val = o[key];
  logic();
});

然而,由于Object.keys是一种本机方法,因此它可以实现更好的优化。

Benchmark

正如您所看到的,Object.keys的速度要快得多。实际的内存存储是否更优则是另一回事。

代码语言:javascript
复制
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);
});
票数 255
EN

Stack Overflow用户

发布于 2012-01-24 02:23:33

还要记住,您可以将第二个参数传递给.forEach()函数,指定要用作this关键字的对象。

代码语言:javascript
复制
// 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);
票数 25
EN

Stack Overflow用户

发布于 2018-12-23 13:46:52

对于简单的键/值迭代,有时像underscorejs这样的库可以成为您的朋友。

代码语言:javascript
复制
const _ = require('underscore');

_.each(a, function (value, key) {
    // handle
});

仅供参考

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7440001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档