Javascript没有通用对象迭代器,允许类似:
foo.iterate (function (key, value) {
console.log ("key->" + key + " value->" + value);
});
实现起来既方便又简单。在任何流行的图书馆都内置了这样的东西吗?我不想重新发明轮子,如果做这样的事情想遵循任何现有方法的命名(和语义)约定。
这样的通用迭代器存在于某个地方吗?
补充说:我一直在修补并向Object.prototype添加了一个迭代器函数。这会将 for 循环放慢约20倍!我甚至没有调用新的迭代器方法,只是将它添加到Object的原型,大大减慢了 for 循环。我假设这否定了Chrome中的优化。这可以解释为什么这些库都没有提到迭代方法给Object。
答案 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)
是的!大多数流行的库实现了某种形式。以下是一些例子:
jQuery.each()。这是一个例子:
$.each([ 52, 97 ], function( index, value ) {
alert( index + ": " + value );
});
Underscore _.each()。以下是这个例子:
_.each([1, 2, 3], alert);
另见the Prototype framework's Enumerable,虽然有点过时了。
我强烈建议使用下划线来实现各种各样的实用程序方法,以便轻松操作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);