0

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

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

我相信你明白了。如果它只是一个简单的对象,那么我可以使用“for in”循环,也许还有嵌套的“for in”循环,一个对象有许多嵌套级别,然后使用嵌套的“for in”循环会变得有些混乱。我认为使用递归会很棒。对此的任何帮助见解将不胜感激。

谢谢你。

4

2 回答 2

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);
    }
}
于 2012-05-04T20:46:59.743 回答
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);
于 2015-11-03T08:06:58.737 回答