9

JS/jQuery オブジェクトのネストされたすべてのプロパティを再帰的にループする方法はありますか?

たとえば、このオブジェクトが与えられた場合

var x = {
    'name': 'a',
    'level': 1,
    'children': [{
        'name': 'b',
        'level': 2,
        'children': [{
            'name': 'c',
            'level': 3,
            'children': [{
            ...
            }]
        }]},
        ...
    }]
}

「a」という名前のオブジェクトとその子、「b」とその子、「c」とその子を無限にループするにはどうすればよいでしょうか。

4

5 に答える 5

19

次のような再帰的なアプローチが最適と思われます。

function recursiveIteration(object) {
    for (var property in object) {
        if (object.hasOwnProperty(property)) {
            if (typeof object[property] == "object"){
                recursiveIteration(object[property]);
            }else{
                //found a property which is not an object, check for your conditions here
            }
        }
    }
}

これは実用的なフィドルです

于 2012-09-06T08:14:34.263 に答える
1

JSON は適切にフォーマットされていませんが、以下のように各項目に「アクセス」できます。

<html>
<head>
    <title>test</title>
    <script type="text/javascript">
        var x = {
                "name": "a",
                "level": 1,
                "children": [
                    {
                        "name": "b",
                        "level": 2,
                        "children": [
                            {
                                "name": "c",
                                "level": 3,
                                "children": [
                                    {
                                        "sss": 23
                                    }
                                ]
                            }
                        ]
                    }
                ]
            };

         function visit(obj){
            for(var prop in obj){
                if(typeof(obj[prop]) == 'object'){
                    if(Object.prototype.toString.call(obj[prop]) == '[object Array]'){
                        for(var i = 0; i < obj[prop].length; i++){
                            document.write("<br />the element " + prop + " (array) was visited");
                            visit(obj[prop][i]);                                
                        }
                    }else{
                        document.write("<br />the element " + prop + " (object) was visited");
                        visit(obj[prop]);
                    }
                }else{
                    document.write("<br />the element " + prop + " = " + obj[prop] + " was visited");
                }
            }
        }

        visit(x);

    </script>
</head>
<body>

</body>

于 2012-09-06T08:13:27.303 に答える
1

私は元々、JavaScript オブジェクトを再帰的に検索する方法を探していましたが、この投稿、特に Jeroen Moons の回答が非常に役立つことがわかりました。戻りオブジェクトを提供するように微調整しました。入力は検索するオブジェクトと{key:value}オブジェクト(針)です。

function searchObject(object, keyvalue){
    var found = false;
    for (var property in object){
        if (object.hasOwnProperty(property)){
            if (typeof object[property] == 'object'){
                found = searchObject(object[property], keyvalue);
                if (found)
                    return found;
            }else{
                key = Object.keys(keyvalue)[0];
                if (property == key && object[key] == keyvalue[key]){
                    console.log('searchObject ' + keyvalue[key] + ' found');
                    return object;
                }
            }
        }
    }
}
于 2014-02-07T03:29:56.660 に答える
0
var x = {
    'name': 'a',
    'level': 1,
    'children': [{
        'name': 'b',
        'level' : 2,
        'children' : [{
            'name': 'c',
            'level' : 3,
            'children' : [{
            }]
        }]
    }, {
        'name': 'b2',
        'level' : 2,
        'children' : [{
            'name': 'c2',
            'level' : 3,
            'children' : [{
            }]
        }]
    }]
}
var step = x;
do {
    if (step instanceof Array){
        for (i=0; i < step.length; i++) {
            callback(step[i]);
        }
    }
    else {
        callback(step);
    }
    step = step.children != undefined ? step.children : null;
} while (step);

function callback (element) {
    console.log(element);
}

構造が変わらない限り、このように降りることができます。

于 2012-09-06T08:19:46.620 に答える
0
function iterate(obj){
    for(var key in obj)
    {
        if(typeof(obj["key"]) == "object"){
            iterate(obj["key"]);
        }
        else{
            console.log(key + ": " + obj["key"];
        }
    }

}
于 2012-09-06T08:22:27.843 に答える