Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象迭代方法?_Javascript_Iterator - Fatal编程技术网

Javascript对象迭代方法?

Javascript对象迭代方法?,javascript,iterator,Javascript,Iterator,Javascript没有一个通用的对象迭代器,以允许: foo.iterate (function (key, value) { console.log ("key->" + key + " value->" + value); }); 实现起来似乎既方便又琐碎。像这样的东西是内置在任何流行的图书馆吗?我不想重新发明轮子,如果这样做的话,我想遵循任何现有方法的命名(和语义)约定 那么像这样的一般迭代器是否存在于某个地方 添加:我一直在修改,并在Object.prototyp

Javascript没有一个通用的对象迭代器,以允许:

foo.iterate (function (key, value) {
    console.log ("key->" + key + " value->" + value);
});
实现起来似乎既方便又琐碎。像这样的东西是内置在任何流行的图书馆吗?我不想重新发明轮子,如果这样做的话,我想遵循任何现有方法的命名(和语义)约定

那么像这样的一般迭代器是否存在于某个地方


添加:我一直在修改,并在Object.prototype中添加了一个迭代器函数。这使for循环的速度降低了大约20倍!我甚至没有调用新的迭代器方法,只是将它添加到对象的原型中,大大降低了循环的速度。我假设这否定了Chrome中的优化。这就解释了为什么上述库中没有一个向对象添加迭代方法。

它没有,但这里有一种方法可以在不使用库或额外函数的情况下完成(除了
for..in
循环):


为什么不为in循环创建一个简单的

for(var key in obj) {
     console.log ("key->" + key + " value->" + obj[key]);
}

您可以在
中使用,但需要添加额外的代码来区分对象本身的属性与从原型继承的属性:

Object.prototype.iterate = function(callback) {
    for (var key in this) {
        if (this.hasOwnProperty(key)) {
             callback(key, this[key]);
        }
    }
}
现在每个对象都有一个iterate()方法,因为我们已经将此函数附加到对象原型。现在,您可以使用OP中的代码示例来迭代对象
foo
的属性


注意:Javascript中没有“类”,函数是第一类数据类型。因此,添加到对象中的任何函数或“方法”也将使用此函数进行迭代。

是!大多数流行的库都实现了某种形式的这种功能。这里有几个例子:

  • 。下面是一个例子:

    $。每个([52,97],函数(索引,值){
    警报(索引+“:”+值);
    });

  • 。这里有一个例子:

    \每个([1,2,3],警报)

  • 显然

  • 另见,尽管有点过时

  • 我强烈推荐下划线,因为它有各种各样的实用方法,使操作JavaScript对象和数组变得容易,甚至对于更复杂的操作也是如此。这样做的优点是可以在客户端和服务器端工作,而不必内置许多DOM操作功能,如jQuery、Dojo和Prototype

    如果希望为数组实现each()的简单版本,请签出及其实现:

    function forEach(array, action) {
      for (var i = 0; i < array.length; i++)
        action(array[i]);
    }
    
    forEach(["Wampeter", "Foma", "Granfalloon"], print);
    
    函数forEach(数组、动作){
    对于(var i=0;i
    jquery$。每个人都这样做..你要选择答案吗?+1,在现代JavaScript中-这是最正确的方法。另外-JavaScript确实有一种方法可以显式地实现这一点-for-in-loop(或者更好,for-of-loop)对象。keys()将创建一个新对象,对吗?如果很容易避免,也可以避免。实际上,Object.keys()将从对象
    foo
    返回一个键数组。例如,如果
    foo={bar:1,baz:2}
    ,那么
    Object.keys(foo)
    将返回
    ['bar',baz']
    @BenjaminGruenbaum为什么不提供一个显示如何使用For语法的答案?我似乎无法在我的控制台(Firefox)上运行它。在我粗略的基准测试中,使用Object.keys()比在Chrome Mac上使用for()迭代要慢10倍。这是我想要的最干净的方法。只是希望它用蝴蝶结包起来,并且能够在arg中提供值。@obelia,记得检查obj.hasOwnProperty(),就像Barmar的回答一样。否则,您还将看到继承的属性,例如来自对象原型链的
    length
    。有关详细讨论,请参见下划线的u.each()实现我想要的功能。我希望它能更干净地作为对象方法(和数组方法)实现。太棒了!很高兴我能为你指出正确的方向。一些JavaScript开发人员不喜欢使用附加功能来扩充本机JavaScript类型(如数组和对象),因为这可能会让人搞不清该语言中添加了什么以及添加了什么。我想这更像是个人喜好,而不是黑白决定。@obelia,我看到你的作品是用
    foo.each(…)
    提到的。它现在有点过时了,但它是基于下划线构建的,可以在它的模型上执行这种操作。
    function forEach(array, action) {
      for (var i = 0; i < array.length; i++)
        action(array[i]);
    }
    
    forEach(["Wampeter", "Foma", "Granfalloon"], print);