0

再帰関数を使用して、ネストされたプロパティなどを含むオブジェクトのすべての属性とプロパティを読み取ることができるでしょうか。たとえば、オブジェクトがある場合:

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

私はあなたが写真を手に入れると確信しています。単純なオブジェクトの場合は、「for in」ループを使用できます。ネストされた「forin」ループの場合、オブジェクトには多数のネストされたレベルがあり、ネストされた「forin」ループを使用すると多少混乱します。再帰を採用するのは素晴らしいことだと思いました。これに対するヘルプの洞察をいただければ幸いです。

ありがとうございました。

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 に答える