Javascript Object迭代方法?

时间:2013-12-13 23:07:24

标签: javascript iterator

Javascript没有通用对象迭代器,允许类似:

foo.iterate (function (key, value) {
    console.log ("key->" + key + " value->" + value);
});

实现起来既方便又简单。在任何流行的图书馆都内置了这样的东西吗?我不想重新发明轮子,如果做这样的事情想遵循任何现有方法的命名(和语义)约定。

这样的通用迭代器存在于某个地方吗?

补充说:我一直在修补并向Object.prototype添加了一个迭代器函数。这会将 for 循环放慢约20倍!我甚至没有调用新的迭代器方法,只是将它添加到Object的原型,大大减慢了 for 循环。我假设这否定了Chrome中的优化。这可以解释为什么这些库都没有提到迭代方法给Object。

4 个答案:

答案 0 :(得分:4)

它没有,但这是一种没有库或额外功能(除for..in循环之外)的方法:

Object.keys(foo).forEach(function(key){
  console.log(this[key]);
}, foo);

答案 1 :(得分:2)

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

Object.prototype.iterate = function(callback) {
    for (var key in this) {
        if (this.hasOwnProperty(key)) {
             callback(key, this[key]);
        }
    }
}

现在每个对象都有一个iterate()方法,因为我们已将此函数附加到Object原型。现在,您可以使用OP中的代码示例来迭代对象foo的属性。

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

答案 2 :(得分:1)

为什么不是一个简单的for in循环?

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

答案 3 :(得分:1)

是的!大多数流行的库实现了某种形式。以下是一些例子:

  1. jQuery.each()。这是一个例子:

    $.each([ 52, 97 ], function( index, value ) { alert( index + ": " + value ); });

  2. Underscore _.each()。以下是这个例子:

    _.each([1, 2, 3], alert);

  3. Dojo Toolkit's forEach()

  4. 显然,Javascript 1.7 has an iterator built in

  5. 另见the Prototype framework's Enumerable,虽然有点过时了。

  6. 我强烈建议使用下划线来实现各种各样的实用程序方法,以便轻松操作JavaScript对象和数组,即使对于更复杂的操作也是如此。这样做的好处是可以在客户端和服务器端工作,而不需要内置大量的DOM操作功能,如jQuery,Dojo和Prototype。

    如果您希望为数组实现each()的简单版本,请查看functional programming chapter in Eloquent Javascript及其实现:

    function forEach(array, action) {
      for (var i = 0; i < array.length; i++)
        action(array[i]);
    }
    
    forEach(["Wampeter", "Foma", "Granfalloon"], print);