2012-05-04 68 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);