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