【问题标题】:how to iterate over inner objects / property in an object如何迭代对象中的内部对象/属性
【发布时间】:2011-07-22 22:09:00
【问题描述】:

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

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

显示的控制台:

obj1 [object Object]
obj12 [object Object]
pr1 message
pr2 mess

但是如何迭代内部对象(obj1, obj2)和它们自己的属性(prop1,prop2)?

【问题讨论】:

    标签: javascript object iteration


    【解决方案1】:

    这是很棒的回答,虽然没有涵盖数组案例,但这是我的贡献:

    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
    • 请小心,因为此方法在打印没有对象的数组时存在一些问题,例如:array: ["value1", "value2", "value"] 或 array: [1234, 1234, 1234]。需要验证数组的元素是否为对象,否则只需要打印值
    【解决方案2】:

    您可以使用递归来实现:

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

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

    【讨论】:

    • 答案是正确的,但比第一个晚了几分钟。尽管如此,还是值得投票。
    • 当然可以,但也许您应该尝试使用对象内的数组测试接受答案的iterate 函数(如{a:[1,2,3], b:3, c:{a:1,b:1}}?
    【解决方案3】:

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

    【讨论】:

    • .. 和美化 JSON 输出,JSON.stringify(obj, null, 4).
    【解决方案4】:

    递归是你的朋友:

    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 属性,则属性是全局的
    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2023-03-24
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2015-11-07
    相关资源
    最近更新 更多