0

プロパティにプロパティが含まれているかどうかを確認する必要があります。現在、例のようなifステートメントを使用しています。

これがサンプルオブジェクトです

var Foo = {
    "bar" : 
        {
            "foobar":
                {
                    "barfoo":1
                }
        }
}

そして、barfoo存在するかどうかを確認する必要がありますが、他の関数が実行されているかどうかに依存しない可能性があるため、最初に他のすべてのプロパティが存在するかどうかを確認する必要があります。この構造のレベルを実際に下げることもできないので、それはオプションではありません。

現在、私はこれに似た何かをしています:

var d = Foo;
if (d) {
    d = d.bar;
    if (d) {
        d = d.foobar;
        if (d) {
            d = d.barfoo;
            if(d){
                console.log(d);
            }
        }
    }
}
4

4 に答える 4

5

ifすべてを1つのステートメントで実行できます。

if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)

これが機能するのは、いずれかの要素が失敗した場合にjavascriptがifステートメントのチェックを停止するため、。のようなエラーが発生しないためcannot check property of undefinedです。

それ以外の場合は、trycatchステートメントを使用できます。

var barfoo;
try{
  barfoo = d.bar.foobar.barfoo
}
catch(e){
  barfoo = null;
}
于 2013-03-27T02:36:38.487 に答える
2

-を使用して単一のifステートメントを実行できます&&。これは短絡評価を行います。

if (d
    && d.hasOwnProperty('bar')
    && d.bar.hasOwnProperty('foobar')
    && d.bar.foobar.hasOwnProperty('barfoo')
) {
    // fancy things happen
}

d.hasOwnProperty('bar')代わりに使用する理由d.barは、何かがオブジェクトのプロトタイプを汚染した場合に備えてです。

于 2013-03-27T02:38:00.907 に答える
2

より堅牢なソリューション:オブジェクトの任意の深さをチェックインします

var Foo = {
    "bar": {
        "foobar": {
            "barfoo": {
                "ddd": 1
            }
        }
    }
};

function checkProps(obj) {
    var ref = obj, arg, i;
    for (i = 1; i < arguments.length; i += 1) {
        arg = arguments[i];
        if(ref.hasOwnProperty(arg)){
            ref = ref[arg]
        } else {
            return false;
        }
    }
    return true;
}
//the function takes the object to search as first parameter and any other properties [,prop1,prop2,...]
console.log(checkProps(Foo, 'bar', 'foobar', 'barfoo', 'ddd'));
于 2013-03-27T02:44:59.880 に答える
0

あなたが知る必要があるのがそれが存在するかどうかだけであるならば、あなたはただtry/catchでそれをすることができます

試す{

  if (Foo.bar.foobar.barfoo) {

      //do stuff with your thingy because you know it exists

  }

} catch(x){

     //you know it's no good/doesn't exist

}

于 2013-03-27T02:40:02.940 に答える