2013-05-12 68 views
0

我已經聲明瞭一個三重嵌套的對象,像這樣:循環通過三嵌套對象在Javascript

var food = { 
    "fruit": { 
     "apples": { 
      "redApples": 20, 
      "greenApples": 30 
     }, 
     "bananas": { 
      "yellowBananas": 10 
     } 
    }, 
    "grains": { 
     "bread": { 
      "brownBread": 50 
     } 
    } 
}; 

我發現this question,它的工作,通過對象的對象迭代,但我堅持。我將如何遍歷這個對象?

更新:對於這個特定的問題,嵌套的for循環會工作得很好,像這樣:

for(var key in food) 
    for(var prop in food[key]) 
     for(var foo in food[key][prop]) 
      console.log(food[key][prop][foo]); 

不過,也有一些很好的遞歸函數下面這將無限期嵌套對象做到這一點。

+5

將代碼放入一個遞歸調用自身的函數中。 – 2013-05-12 14:55:58

+0

您需要一個抽象解決方案(適用於「無限」嵌套對象)或簡單地說明如何迭代此特定對象中的所有鍵/值? – sixFingers 2013-05-12 15:02:02

+0

剛剛使用嵌套循環時出現了什麼問題(您需要比您找到的問題更多的級別)。由於它不是無限嵌套的,而只有3個層次,所以不需要遞歸。 – Bergi 2013-05-12 15:42:58

回答

4

馬丁是對的,遞歸函數就是這個方法。你的函數應該檢查的是屬性的一個對象。如果是這樣的話 - 函數必須通過自己調用來更深入地行走,但是使用嵌套對象。

function recursiveIter(obj){ 
    for (var i in obj){ 
     if (typeof obj[i]=="object"){ 
      recursiveIter(obj[i]); 
     } 
     else { 
      $('.ins').append(obj[i]); // or what do you want to do with that   
     } 
    } 
} 

recursiveIter(food); 

jsfiddle用這種方法。

1

您可以創建一個接受對象和回調的通用函數,然後執行遞歸調用。

function objectWalk (obj, callback){ 
    for(o in obj){ 
     if(typeof obj[o] === 'object'){ 
      objectWalk(obj[o], callback); 
     }else { 
      callback(obj[o]); 
     } 
    } 
} 

我在這裏做的是循環瀏覽對象並檢查循環中的每個項目是否是一個對象。如果是,請再次調用相同的函數。如果不是,則將對象的值傳遞給回調。它是一個方便的小功能。

看到它在行動here