2017-01-23 12 views
0

我使用以下代碼,它工作良好,但完全停止工作時,「thsub」爲空,並且不會繼續讀取其餘數據,並且僅返回一個TypeError,表示「thsub in 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

目前所有的答案都加入了0磨片它是空的......我需要它跳過空記錄。例如,如果它發現「thsub」:null ...那麼跳到下一個 – PaulTenna2000

回答

1

您的循環正在檢查thsub的長度屬性。如果thsub爲空,那麼你的代碼嘗試檢查一個空的對象,這將永遠破壞你的代碼的屬性(長)..嘗試檢查長度之前增加對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

,而不是將數組0添加到數組中,如果它爲空,它不能忽略它嗎? – PaulTenna2000

1

只需在訪問屬性前添加警戒條件,如果您嘗試調用nullundefined對象上的屬性,則會引發錯誤。過屬性訪問返回falsy值時

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; 
    } 
    } 
} 

在固定用例tsubs將被設置爲一個空數組。

+0

,而不是向數組中添加0,如果它爲空,它不能忽略它嗎? – 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,該條件將評估爲false,和異常引起的代碼將不會執行。

+0

請確保在檢查'data.cars [l] .thsub'之前檢查'data.cars [l] .thsub.length' –

+0

@MattSpinks謝謝,意思是這樣做,不知道我是如何錯過它的。 – furkle

+0

而不是向數組中添加0,如果它爲空,它不能忽略它嗎? – PaulTenna2000

0

只需選中thsub變量第一:

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; 
    } 
}