2012-05-04 67 views
0

我想知道是否可以使用遞歸函數來讀取對象的所有屬性和屬性,包括嵌套屬性等。例如,如果 我有一個目標:使用遞歸讀取對象的屬性和屬性?

var mObj = {}; 
    mObj.countries = []; 
    mObj.country = {}; 
    mObj.country.states = []; 
    mObj.country.state = {}; 
    mObj.country.state = {}; 

我相信你得到的圖片。如果它只是一個簡單的對象,那麼我可以使用「for in」循環,也許嵌套「for in」循環,一個對象有許多嵌套級別,然後使用嵌套的「for in」循環變得有些混亂。我認爲使用遞歸會很好。任何有助於深入瞭解這一點將非常感謝。

謝謝。

+1

我會說是的,你必須使用遞歸。絕對正確的觀察。所以請注意,發佈你的代碼並告訴我們你有什麼問題 – ControlAltDel

+0

我今天很慢,我不明白。你可以用模擬輸入對象詳細說明,並描述你想要的輸出類型嗎?就像,給了mObj你想要那些mObj.countries,狀態,填入? –

+0

在Chrome的開發者工具(或者Firebug,我相信)中,如果你使用'console.log()'對象,它將遞歸地打印它的所有屬性。我建議你使用其中的一種進行開發,除非你想將這些信息用於調試以外的其他功能。 –

回答

3

下面是一個簡單的例子,如果您最終遇到任何問題,請執行此操作。

​​
+0

非常感謝你。這真的有幫助。現在我知道如何解決這個問題。太棒了。 – Combustion007

0

與OP有同樣的問題,但無法使接受的解決方案正常工作。這是我最終做的:

function foreachAttribute(object, handleAttributeName, handleAttributeValue) { 

    var attributeNames = []; 
    function recursion(object) { 

     for (var attribute in object) { 

      if (typeof object[attribute] == 'object') { 

       attributeNames.push(attribute); 
       recursion(object[attribute]); 
       attributeNames = attributeNames.slice(0, 
         attributeNames.length - 1); 

      } else { 

       handleAttributeName(attributeNames.join(".") + "." 
         + attribute); 
       handleAttributeValue(object[attribute]); 

      } 

     } 

    } 

    recursion(object); 

} 

var attributeName = ""; 
var handleAttributeName = function(name) { 
    attributeName = name; 
}; 

var handleAttributeValue = function(value) { 
    console.log(attributeName + "=" + value); 
}; 

var data = { 
    var1 : { 
     asdf : 123 
    }, 
    var2 : 321 
}; 

foreachAttribute(data, handleAttributeName, handleAttributeValue);