使用递归读取对象的属性和属性?

时间:2012-05-04 20:14:51

标签: javascript jquery properties recursion

我想知道我是否可以使用递归函数来读取对象的所有属性和属性,包括嵌套属性等。例如, 如果我有一个对象:

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

我相信你能得到这张照片。如果它只是一个简单的对象,那么我可以使用“for in”循环,也许嵌套“for in”循环,一个对象有许多嵌套级别,然后使用嵌套的“for in”循环变得有些混乱。我认为使用递归会很棒。对此的任何帮助见解都将受到高度赞赏。

谢谢。

2 个答案:

答案 0 :(得分:3)

这是一个快速示例,可以帮助您解决任何问题。

var level = '';
var readProperties = function(val) {
    if (Object.prototype.toString.call(val) === '[object Object]') {
        for (var propertyName in val) {
            if (val.hasOwnProperty(propertyName)) {
                console.log(level + propertyName + ':');
                level += '  ';
                readProperties(val[propertyName]);
            }
        }
    }
    else {
        console.log(level + val);
        level = level.substring(0, level.length - 2);
    }
}

答案 1 :(得分: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);