2

私の問題はこれです:

次の名前の構造を含む JSON を返すエンドポイントがあります。the_data_i_want

サーバーが値があることを検出すると、次のthe_data_i_wantようなものが返されます。

{
    "sample": {
        "title": "The Title",
        "foo": {
            "Bar": {
                "Baz": {
                    "Qux": {
                        "the_data_i_want": "DATA PARTY!!!!"
                    }
                }
            }
        }
    }
}

サーバーがそれが空であることを検出した場合、サーバーがthe_data_i_want返す JSON は次のようになります。

{
    "sample": {
        "title": "The Title"
    }
}

sample.foo.Bar.Baz.Qux.the_data_i_want私の問題は、チェーンのどのセグメントでもundefined、json 構造を介して各ステップでチェックのこれらのクレイジーチェーンを実行することになるため、未定義であるかどうかを最初に確認し、そうでない場合は、次のものを試すことです。そして、私が着くまで次のものthe_data_i_wantは間違っているようです。

質問:

これを処理する「正しい」方法はありますか?ネストが任意に深い場合でも、どうすればよいですか? 私はjQueryを使用することにオープンです。

ありがとう!

4

1 に答える 1

1

これはうまくいくかもしれません..しかし、そこにはもっと良い方法があるかもしれません..

このアプローチでは、すべてのキーを配列に入れて、ループでチェックします。

var obj = {
    "sample": {
        "title": "The Title",
        "foo": {
            "Bar": {
                "Baz": {
                    "Qux": {
                        "the_data_i_want": "DATA PARTY!!!!"
                    }
                }
            }
        }
    }
};

var arr = ["foo", "Bar", "Baz", "Qux", "the_data_i_want"];
var arr1 = ["foo", "Bar", "Baz", "Qux", "the_data_i_want", "ding"];

checkKey('Object 1' , arr);
checkKey('Object 2 ' ,arr1);

function checkKey(str ,arr) {
    if (obj && obj.sample) {
        var k = obj.sample;
        var i = 0;
        for (var i = 0; i < arr.length; i++) {
            if (k[arr[i]]) {
                k = k[arr[i]];
                if (i === arr.length - 1) {
                    alert('Data Found :: ' + k);
                }
            }
            else {
                alert('No such Key in :: ' + str );
                break;
            }
        }
    }
    else {
         alert('No such Key in :: ' + str );
    }
}​

フィドルをチェック

于 2012-12-11T22:55:48.210 に答える