6

オブジェクトと配列が混在する複雑なjsonオブジェクトxがあるとします。次のように、変数がnullであるか、このオブジェクト内で未定義であるかを確認する簡単な方法または一般的な方法はありますか?

if(x.a.b[0].c.d[2].e!=null) ....

通常、すべての親フィールドをチェックする代わりに

if(x.a!=null 
&& x.a.b!=null
&& x.a.b[0]!=null
&& x.a.b[0].c!=null
&& x.a.b[0].c.d!=null
&& x.a.b[0].c.d[2]!=null
&& x.a.b[0].c.d[2].e!=null) ....
4

2 に答える 2

6
try {
   if(x.a.b[0].c.d[2].e!=null)
    //....
} catch (e) {
    // What you want 
}

ライブデモ

于 2013-01-02T04:50:36.510 に答える
3

これは例外処理を必要としないバリアントです..それはより速くなりますか?疑わしい。きれいになりますか?まあ、それは個人的な好みに依存します..もちろん、これはほんの小さな実証的なプロトタイプであり、より良い「JSONクエリ」ライブラリがすでに存在していると確信しています。

// returns the parent object for the given property
// or undefined if there is no such object
function resolveParent (obj, path) {
    var parts = path.split(/[.]/g);
    var parent;
    for (var i = 0; i < parts.length && obj; i++) {
        var p = parts[i];
        if (p in obj) {
            parent = obj;
            obj = obj[p];
        } else {
            return undefined;
        }
    }
    return parent;
}

// omit initial parent/object in path, but include property
// and changing from [] to .
var o = resolveParent(x, "a.b.0.c.d.2.e");
if (o) {
    // note duplication of property as above method finds the
    // parent, should it exist, so still access the property
    // as normal
    alert(o.e); 
}
于 2013-01-02T05:04:55.257 に答える