1

私がこのようなオブジェクトを持っていると考えてください:

Obj.Boo.Foo.Zoo

zooさて、それが値を持ち、空ではないことを確認したい場合は、次のようにする必要があります。

if(Obj != null && Obj.Boo != null && Obj.Boo.Foo != null && Obj.Boo.Foo.Zoo != null) {
    //blah blah
}

そして、の後にネストされたオブジェクトがもっとある場合はZoo、を展開する必要がifあり、コードが少し不正になります。

そのタイプの条件を実行するためのより良い方法はありますか?

4

3 に答える 3

3

chainGet(obj, chain, default)私はこのような状況のために私が呼​​び出す小さな関数を保持しています:

function chainGet(obj, chain, dflt) {
    if (typeof chain === "string")
        chain = chain.split(".");
    var result = obj;
    for (var i = 0; i < chain.length; i += 1) {
        if (result === undefined)
            break;
        result = result[chain[i]];
    }
    return result === undefined? dflt : result;
}

例えば:

> chainGet({ foo: 42 }, "foo")
42
> chainGet({ foo: 42 }, "bar", "x")
'x'
> chainGet({ foo: { bar: 42 }}), "foo.bar")
42

これは配列でも機能します。

> chainGet([{ foo: [42] }], [0, "foo", 0])
42

もちろん、点線のアクセスの長いチェーンはコードの臭いなので、それらを使用するときは注意が必要です…しかし、時にはそれをしなければならないこともあります;)

于 2013-02-12T06:17:58.343 に答える
0

このような場合を実際に処理する必要がない場合の悪い習慣は、trycatchステートメントでオブジェクトにアクセスしてみることです。

try{
    // access Obj.Boo.Foo.Zoo
}
catch{
    // catch a NullReferenceException
}

より良い方法は、サブオブジェクトとそのnullにアクセスしようとすると、親オブジェクトが適切な例外をスローするか、これを処理するように、ゲッターとセッターを変更することです。この場合、最初のオブジェクトをチェックするだけで十分です。

于 2013-02-12T06:24:36.600 に答える
0

関数を使わなくても実現できます。ショートカットメソッドは次のようになります-

if(((((Obj || {}).Boo || {}).Foo || {}).Zoo || {}) != {}) {
    // Zoo has a value and not empty
}

またはES6の方法-

const checkNull = (keys, Object) =>
  keys.reduce((Obj, o) =>
    (Obj && Obj[o]) ? Obj[o] : null, Object)

console.log(checkNull(['Boo', 'Foo', Zoo], Obj))
// [Value of Zoo]
console.log(checkNull(['Boo', 'Foo1', Zoo], Obj))
// null
于 2018-05-29T14:50:37.213 に答える