Javascript 如何迭代对象中的内部对象/属性

Javascript 如何迭代对象中的内部对象/属性,javascript,object,iteration,Javascript,Object,Iteration,我有一个对象,其内部对象和属性定义如下: var obj = {obj1 : { "prop1" : "nothing", "prop2" : "prop"}, obj2 : {"prop1" : "nothing", "prop2" : "prop"}, pr1 : "message", pr2 : "mess" }; 通常,要迭代对象的每个属性,for。。在中,循环可以实现这一点 for (property in obj){ if (

我有一个对象,其内部对象和属性定义如下:

var obj = {obj1 : { "prop1" : "nothing", "prop2" : "prop"},
        obj2 : {"prop1" : "nothing", "prop2" : "prop"},
        pr1 : "message",
        pr2 : "mess"
};
通常,要迭代对象的每个属性,
for。。在
中,循环可以实现这一点

for (property in obj){
    if (obj.hasOwnProperty(property)){
        console.log(property + "   " + obj[property]);
    }
}
控制台显示:


但是,如何迭代内部对象(
obj1,obj2
)及其自身属性(
prop1,prop2
)?

递归是您的朋友:

function iterate(obj) {
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            if (typeof obj[property] == "object")
                iterate(obj[property]);
            else
                console.log(property + "   " + obj[property]);
        }
    }
}

注意:不要忘记使用
var
在本地声明
属性

您可以使用递归来实现:

function Props(obj) {

 function getProps(obj){
  for (var property in obj) {
    if (obj.hasOwnProperty(property)){
        if (obj[property].constructor == Object) {
           console.log('**Object -> '+property+': ');
           getProps(obj[property]);
        } else {
           console.log(property + " " + obj[property]);
        }
    }
  }
 }
 getProps(obj);
}

请参见

为了简单地显示对象结构,我经常使用:console.log(JSON.stringify(obj))

这是很好的anwsers,虽然没有介绍数组情况,但我的贡献如下:

var getProps = function (obj) {
    for (var property in obj) {
        if (obj.hasOwnProperty(property) && obj[property] != null) {
            if (obj[property].constructor == Object) {
                getProps(obj[property]);
            } else if (obj[property].constructor == Array) {
                for (var i = 0; i < obj[property].length; i++) {
                    getProps(obj[property][i]);
                }
            } else {
                console.log(obj[property]);
            }
        }
    }
}
getProps(myObject);
var getProps=函数(obj){
for(obj中的var属性){
if(obj.hasOwnProperty(property)&&obj[property]!=null){
if(obj[property].constructor==Object){
getProps(对象[属性]);
}else if(obj[property].constructor==Array){
对于(var i=0;i
非常感谢!如果我忘记声明var属性,则属性为全局。答案是正确的,但比第一个晚几分钟。尽管如此,它还是值得投票支持的。当然,我很好,但也许你应该尝试使用对象内的数组(比如
{a:[1,2,3],b:3,c:{a:1,b:1}
})测试接受答案的
迭代
函数?当属性也可以是字符串时,覆盖数组尤其重要-否则您将得到随机垃圾作为输出,或者您将超过调用堆栈大小。+1为此,请小心,因为此方法在打印没有对象的数组时会出现一些问题,例如:数组:[“value1”、“value2”、“value”]或数组:[1234、1234、1234]。需要验证数组的元素是否为对象,否则只需打印值..并美化JSON输出,
JSON.stringify(obj,null,4)
var getProps = function (obj) {
    for (var property in obj) {
        if (obj.hasOwnProperty(property) && obj[property] != null) {
            if (obj[property].constructor == Object) {
                getProps(obj[property]);
            } else if (obj[property].constructor == Array) {
                for (var i = 0; i < obj[property].length; i++) {
                    getProps(obj[property][i]);
                }
            } else {
                console.log(obj[property]);
            }
        }
    }
}
getProps(myObject);