154

私のコードでは、多くのオブジェクトが互いに入れ子になっているいくつかのエントリを持つ配列を扱いますが、そうでないものもあります。次のようになります。

// where this array is hundreds of entries long, with a mix
// of the two examples given
var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];

時々配列を反復処理する必要があるため、これにより問題が発生し、矛盾により次のようなエラーがスローされます。

for (i=0; i<test.length; i++) {
    // ok on i==0, but 'cannot read property of undefined' on i==1
    console.log(a.b.c);
}

と言えることは承知していますif(a.b){ console.log(a.b.c)}が、最大 5 ~ 6 個のオブジェクトが相互にネストされている場合、これは非常に面倒です。エラーをスローせずに、存在する場合にのみ console.log を実行できる他の (より簡単な) 方法はありますか?

4

18 に答える 18

53

あなたがしていることは例外を引き起こします(そして当然のことです)。

あなたはいつでもできる

try{
   window.a.b.c
}catch(e){
   console.log("YO",e)
}

しかし、私はそうしません。代わりに、あなたのユースケースを考えてください。

なぜ、見慣れない 6 つのレベルでネストされたデータにアクセスしているのでしょうか。これを正当化するユースケースは何ですか?

通常、扱っているオブジェクトの種類を実際に検証したいと思います。

if(a.b)また、 ab が 0 の場合、または "0" の場合でも false を返すため、次のようなステートメントを使用しないでください。代わりに、a.b !== undefined

于 2013-02-08T22:18:19.537 に答える
15

あなたの質問を正しく理解していれば、オブジェクトにプロパティが含まれているかどうかを判断する最も安全な方法が必要です。

最も簡単な方法は、in演算子を使用することです。

window.a = "aString";
//window should have 'a' property
//lets test if it exists
if ("a" in window){
    //true
 }

if ("b" in window){
     //false
 }

もちろん、これを好きなだけ深くネストすることができます

if ("a" in window.b.c) { }

これが役立つかどうかはわかりません。

于 2013-02-08T23:16:33.530 に答える
13

lodashを使用している場合は、「has」機能を使用できます。ネイティブの「in」に似ていますが、パスを許可します。

var testObject = {a: {b: {c: 'walrus'}}};
if(_.has(testObject, 'a.b.c')) {
  //Safely access your walrus here
}
于 2015-08-07T19:05:23.983 に答える
5

私はundefsafeを宗教的に使用しています。要求された値を取得するか、「未定義」を返すまで、オブジェクトの各レベルをテストします。しかし、決してエラーではありません。

于 2016-05-12T16:32:19.287 に答える
0

プロパティを取得する前にデフォルト値を指定すると、エラーを回避できます

var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];

for (i=0; i<test.length; i++) {
    const obj = test[i]
    // No error, just undefined, which is ok
    console.log(((obj.a || {}).b || {}).c);
}

これは配列でもうまく機能します:

const entries = [{id: 1, name: 'Scarllet'}]
// Giving a default name when is empty
const name = (entries.find(v => v.id === 100) || []).name || 'no-name'
console.log(name)

于 2020-08-05T21:37:26.040 に答える