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

16

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

var obj = {obj1 : { "prop1" : "nothing", "prop2" : "prop"},
        obj2 : {"prop1" : "nothing", "prop2" : "prop"},
        pr1 : "message",
        pr2 : "mess"
};

通常要迭代一个对象的每个属性,可以使用for...in循环来完成。

for (property in obj){
    if (obj.hasOwnProperty(property)){
        console.log(property + "   " + obj[property]);
    }
}

控制台显示:

the console displayed :
obj1 [object Object]
obj12 [object Object]
pr1 message
pr2 mess
然而如何迭代内部对象(obj1, obj2)及其自身属性(prop1,prop2)?
4个回答

34

递归是你的朋友:

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 声明局部的 property


非常感谢!如果我忘记声明var property,那么property就是全局的,返回True。 - Raymond Chenon

13

这是非常好的答案,尽管没有涵盖数组情况,这是我的贡献:

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);

覆盖数组在属性也可以是字符串时尤为重要 - 否则您将得到随机垃圾作为输出,或者超出调用堆栈大小。对此加1。 - Michał Siwek
请注意,此方法在打印没有对象的数组时存在一些问题,例如:array: ["value1", "value2", "value"] 或 array: [1234, 1234, 1234]。需要验证数组元素是否为对象,否则只需打印值即可。 - Jason Glez

5
您可以使用递归来实现这一点:
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);
}

see http://jsfiddle.net/KooiInc/hg6dU/


答案是正确的,但比第一名晚了几分钟。尽管如此,它值得投赞成票。 - Raymond Chenon
1
当然可以,但是也许你应该尝试使用对象内的数组(例如{a:[1,2,3], b:3, c:{a:1,b:1}})来测试已接受答案中的iterate函数? - KooiInc

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

2
为了美化JSON输出,可以使用JSON.stringify(obj, null, 4) - Nishant Ghodke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接