2012-08-07 51 views
97

可能重复:
Iterate over Object Literal Values每个对象?

我有对象在JavaScript:

var object = someobject; 

Object { aaa=true, bbb=true, ccc=true } 

如何使用每个为这个?

object.each(function(index, value)) { 
     console.log(value); 
} 

不工作。

+0

http://stackoverflow.com/questions/921789/how-to-loop-through-javascript-object-literal-with-objects-as-成员 – 2012-08-07 12:55:39

+0

你使用jQuery吗?你期望什么结果?控制台中有三个“真”吗? – davids 2012-08-07 12:56:24

+0

jQuery的$ .each文档(http://api.jquery.com/jQuery.each/)有一个完美的例子 - 请参阅页面上的第二个代码块。使用alert()而不是console.log()。 – Faust 2012-08-07 13:00:24

回答

255

javascript对象没有标准的.each功能。 jQuery提供了一个函数。见http://api.jquery.com/jQuery.each/下面应该工作

$.each(object, function(index, value) { 
    console.log(value); 
}); 

另一种选择是使用香草的Javascript使用Object.keys()和数组这样

Object.keys(object).map(function(objectKey, index) { 
    var value = object[objectKey]; 
    console.log(value); 
}); 

.map()功能见https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keyshttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

这些通常是更好比使用一个vanilla Javascript for-loop,除非你真的理解使用正常for循环的含义并且看它的具体用途像循环过财产链一样的特征。

但是通常,for-loop的效果并不比jQueryObject.keys().map()好。我将在下面使用普通的for-loop来解决两个潜在的问题。


权,因此也在其他的答案中指出,一个普通的JavaScript替代办法是

for(var index in object) { 
    var attr = object[index]; 
} 

没有与此两个潜在的问题:

1。你想检查你发现的属性是否来自对象本身,而不是来自原型链。这可以通过hasOwnProperty功能进行检查,像这样

for(var index in object) { 
    if (object.hasOwnProperty(index)) { 
     var attr = object[index]; 
    } 
} 

更多信息请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

jQuery.eachObject.keys函数会自动处理它。

2。简单for循环的另一个潜在问题是范围和非闭包。这有点复杂,但以下面的代码为例。我们有一堆与IDS BUTTON0,按钮1,按钮2等按钮,我们要对其设置一个onclick,做一个console.log这样的:

<button id='button0'>click</button> 
<button id='button1'>click</button> 
<button id='button2'>click</button> 

var messagesByButtonId = {"button0" : "clicked first!", "button1" : "clicked middle!", "button2" : "clicked last!"]; 
for(var buttonId in messagesByButtonId) { 
    if (messagesByButtonId.hasOwnProperty(buttonId)) { 
     $('#'+buttonId).click(function() { 
      var message = messagesByButtonId[buttonId]; 
      console.log(message); 
     }); 
    } 
} 

如果,一段时间后,我们点击任何按钮我们将永远得到“最后点击!”在控制台中,并且从不“先点击!”或“点击中间!”。为什么?因为在执行onclick函数时,它会在时刻使用buttonId变量显示messagesByButtonId[buttonId]。并且由于该循环在那一刻完成,所以buttonId变量仍然是“button2”(它在上次循环迭代期间的值),因此messagesByButtonId[buttonId]将是messagesByButtonId["button2"],即“最后点击!”。

有关闭包的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures。尤其是该页面涵盖我们示例的最后一部分。

再次,jQuery.eachObject.keys().map()自动解决这个问题对我们来说,因为它为我们提供了function(index, value)(具有封闭),所以我们是安全的,同时使用索引和值和放心,他们有我们所期望的价值。

+3

“更简单的选项”不是由你提供的,只是说 – Alexander 2012-08-07 13:00:26

+1

是真的,我稍后再编辑它。编辑说明清楚。 – 2012-08-07 13:33:11

+2

“容易”并不总是“最好的”,所以.. – Juan 2014-04-28 02:45:01

58
for(var key in object) { 
    console.log(object[key]); 
} 
+0

谢谢,但这个回报我”真实“,而不是aaa,bbb,ccc :( – 2012-08-07 13:19:47

+3

是啊多数民众赞成在什么它的priting安慰属性的价值是真实的每个键,如果你想看到aaa,bbb,ccc然后使用'console.log(key);' – 2012-08-07 17:34:55

+13

请注意,您可能想要检查找到的密钥是来自对象本身,还是来自原型链。使用object.hasOwnProperty(key)检查 – 2013-10-03 11:26:32

-1

var object = { "a": 1, "b": 2}; 
 
$.each(object, function(key, value){ 
 
    console.log(key + ": " + object[key]); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

//output 
a: 1 
b: 2 
+4

这是错误的! $ .each是JQuery-Framework! – raiserle 2014-04-14 11:44:55

+1

这取决于jquery。有没有jQuery解决方案? – 2014-07-29 21:17:29

+2

你应该添加一些标题给你的答案,说明它是jQuery依赖的 – davidtaubmann 2017-04-07 14:40:26