0

次のように、トリプルネストされたオブジェクトを宣言しました。

var food = {
    "fruit": {
        "apples": {
            "redApples": 20,
            "greenApples": 30
        },
        "bananas": {
            "yellowBananas": 10
        }
    },
    "grains": {
        "bread": {
            "brownBread": 50
        }
    }
};

オブジェクトのオブジェクトを反復処理するために機能するこの質問を見つけましたが、行き詰まっています。このオブジェクトをどのように反復処理しますか?

更新:この特定の問題については、ネストされた for ループは次のようにうまく機能します。

for(var key in food)
    for(var prop in food[key])
        for(var foo in food[key][prop])
            console.log(food[key][prop][foo]);

ただし、以下に、無期限にネストされたオブジェクトに対してこれを行う優れた再帰関数がいくつかあります。

4

3 に答える 3

4

マーティンの言うとおり、再帰関数がアプローチです。関数がチェックする必要があるのは、オブジェクトの属性です。そうである場合、関数は自分自身も呼び出すことによってより深く歩く必要がありますが、ネストされたオブジェクトを使用します。

function recursiveIter(obj){
    for (var i in obj){
        if (typeof obj[i]=="object"){
            recursiveIter(obj[i]);
        }
        else {
            $('.ins').append(obj[i]);  // or what do you want to do with that           
        }
    }
}

recursiveIter(food);

このアプローチをjsfiddleします。

于 2013-05-12T15:10:41.673 に答える
1

オブジェクトとコールバックを受け入れてから再帰呼び出しを行う一般的な関数を作成できます。

function objectWalk (obj, callback){
    for(o in obj){
        if(typeof obj[o] === 'object'){
            objectWalk(obj[o], callback);
        }else {
            callback(obj[o]);
        }
    }
}

ここで行っているのは、オブジェクトをループして、ループ内の各項目がオブジェクトかどうかを確認することです。そうである場合は、同じ関数を再度呼び出します。そうでない場合は、オブジェクトの値をコールバックに渡します。その便利な小さな機能。

実際の動作はこちらでご覧ください。

于 2013-05-12T15:16:19.630 に答える