使用原型迭代JavaScript中对象的每个属性?


89

有没有一种方法可以使用Prototype JavaScript框架遍历对象的每个属性?

情况如下:我正在JSON中收到AJAX响应,看起来像这样:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

如果我将json响应评估为变量response,则希望能够遍历response.barobj对象中的每个属性,以查看哪些索引为真,哪些索引为假。

原型具有两者Object.keys()Object.values()但奇怪的是似乎没有简单的Object.each()功能!我可以获取Object.keys()和Object.values()的结果,并在遍历一个对象时交叉引用另一个对象,但这是一个hack,我相信有正确的方法可以做到这一点!

Answers:


42

您必须首先将对象文字转换为Prototype Hash

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

完善!这正是我想要的。
OverloadUT

57
不幸的是,由于关闭了一个类似的问题,而这个问题只想遍历没有Prototype的简单javascript对象,因此我现在不得不将此答案视为与由于“重复”而关闭的问题相同。因此,一个可怕的例子迫使用户加载原型。用户没有说任何关于Prototype的信息,因此强迫他们加载不需要的库是没有用的。(请记住,将其视为真的重复)。如果另一个问题由于虚假的重复要求而未能解决,那么我就不必否决答案。

2
询问者是否没有提到他们想要原型(还是对问题进行了编辑?)?无论如何,一切都很好
emurano 2011年

无需加载外部库
Healkiss 2015年

553

这里不需要原型:JavaScript有for..in循环。如果您不确定是否有人惹恼了Object.prototype,也请进行检查hasOwnProperty(),即

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
感谢您提供实际答案,而不必强迫我们加载不需要的库。

8
这不是正确的答案。问题表明必须使用原型!选择的自由-哈哈...
斯文·拉尔森

1
这个问题的原始标题提到Prototype,为了清楚起见,我添加了Prototype。正如人体的第一行所证明的那样,这个问题专门询问的是使用原型的环境。
OverloadUT

1
您编写的Javascript越多,您就讨厌编写for循环越多:)
Triptych

13
不幸的是,如果您对Google提出诸如“如何遍历每个对象属性javascript”之类的问题,则该问题会弹出#1的位置,因此很多来这里的人们可能确实正在寻找该问题的答案。他们想要的问题是这个:stackoverflow.com/questions/921789/…,它实际上与对象文字无关。
Baxissimo'9

0

您应该遍历键并使用方括号获取值。

请参阅:如何枚举javascript对象的属性?

编辑:显然,这使问题重复。


强烈建议不要在Prototype文档中使用该方法:prototypejs.org/api/array
OverloadUT,2009年

1
另外,我不认为这是重复的,因为我一直在寻找Prototype-native解决方案。对于不希望使用框架的人来说,另一个问题是不错的选择,但是如果您使用的是Prototype,则此解决方案会更安全。
OverloadUT

1
@OverloadUT:您没有足够仔细地阅读:不鼓励在数组而不是普通对象的属性上进行迭代
Christoph
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.