2017-01-23 5 views
0

"thsub"がnullで、残りのデータの読み取りを続けずに "thsub in null"という文字を返すだけで、完全に機能する停止機能を使用している次のコードを使用しています。ここで データがnullのときにJavascriptコードが壊れる

はコードです:

var data = { 
    "cars": [{ 
     "id": "1", 
     "name": "name 1", 
     "thsub": [{ 
     "id": "11", 
     "name": "sub 1", 
     "stats": { 
      "items": 5, 
     }, 
     "ions": null 
     }, { 
     "id": "22", 
     "name": "sub 2", 
     "stats": { 
      "items": 5, 
     }, 
     "translations": null 
     }], 
     "image": null 
    }, 

    { 
     "id": "2", 
     "name": "name 2", 
     "thsub": null, //this will break the code 
     "image": null 
    } 
    ] 
} 



var thCount = []; 

for (var l = 0, m = data.cars.length; l < m; l++) { 
    thCount[l] = 0; 
    for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) { 
    if (data.cars[l].thsub[i].stats) { 
     thCount[l]+=data.cars[l].thsub[i].stats.items; 
    } 
    } 
} 

console.log(thCount); 

どのように私はこの問題を解決することができますか?

+0

をnはnullです... nullレコードをスキップする必要があります。たとえば、「thsub」が見つかった場合:null ...次に配列に0を追加する代わりに次の – PaulTenna2000

答えて

1

ループがthsubの長さ属性をチェックしています。 thsubがnullの場合、あなたのコードは、常にあなたのコードが壊れますnullオブジェクトの属性(長さ)をチェックしようとします。..長さをチェックする前にthsubオブジェクト自体のチェックを追加してみてください:

for (var l = 0, m = data.cars.length; l < m; l++) { 
    thCount[l] = 0; 
    if (data.cars[l].thsub) { 
    for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) { 
     if (data.cars[l].thsub[i].stats) { 
     thCount[l]+=data.cars[l].thsub[i].stats.items; 
     } 
    } 
    } 
} 

ワーキングサンプル:

https://jsfiddle.net/mspinks/bwmwntay/5/

+0

を返すだけです。nullの場合は無視できませんか? – PaulTenna2000

1

プロパティにアクセスする前にガード条件を追加するだけで、nullまたはundefinedオブジェクトでプロパティを呼び出せばエラーがスローされます。固定されたユースケースtsubs

for (var l = 0, m = data.cars.length; l < m; l++) { 
    thCount[l] = 0; 
    let tsubs = data.cars[l].thsub || []; <--- Guard condition 
    for (var i = 0, j = tsubs.length; i < j; i++) { 
    if (data.cars[l].thsub[i].stats) { 
     thCount[l] += data.cars[l].thsub[i].stats.items; 
    } 
    } 
} 

これまでプロパティアクセスfalsy値を返したときに、空の配列に設定されます。

+0

にスキップします。nullの場合は無視できませんか? – PaulTenna2000

4

thsublengthプロパティが参照されているために壊れています。 nullにはプロパティがなく、できないため、エラーが発生します。これは、この状況やnullを使用するあらゆる状況で、ループを壊したり、コードを実行したりしないように、ある種の条件を追加することで簡単に回避できます。

は簡単な例です:

for (var l = 0, m = data.cars.length; l < m; l++) { 
    if (data.cars[l].thsub) { 
    for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) { 
     if (data.cars[l].thsub[i].stats) { 
     thCount[l]+=data.cars[l].thsub[i].stats.items; 
     } 
    } 
    } 
} 

注追加data.cars[l].thsub - この値がnullの場合、条件が偽と評価され、例外の原因となるコードが実行されることはありません。

+0

'data.cars [l] .thsub'を確認する前に' data.cars [l] .thsub.length'を確認してください。 –

+0

@MattSpinksありがとう、それをすることを意味しました。アレイに0を追加する代わりに – furkle

+0

を返します。ヌルであれば無視できませんか? – PaulTenna2000

0

ただ、最初thsub変数チェック:すべての答えは0 WHEを追加している現時点で

var thsub; 

for (var l = 0, m = data.cars.length; l < m; l++) { 
    thCount[l] = 0; 
    thsub = data.cars[l].thsub; 

    if (!(thsub instanceof Array)) continue; // If it's not an array, skip it. 

    for (var i = 0, j = thsub.length; i < j; i++) { 
    if (!thsub[i].stats) continue; // If it doesn't contain 'stats', skip it. 

    thCount[l] += thsub[i].stats.items; 
    } 
} 
関連する問題