2012-08-07 68 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