2017-01-23 3 views
0

Ich benutze den folgenden Code, der gut funktioniert, aber total funktioniert nicht mehr, wenn "thsub" Null ist und nicht weiter den Rest der Daten liest und nur ein TypeError "Thsub in Null" zurückgibt HierJavascript-Code bricht, wenn Daten Null hat

ist der Code:

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

Wie kann ich dieses Problem beheben?

+0

im Moment alle Antworten sind das Hinzufügen einer 0 wHE n es ist null ... Ich brauche es, um Null-Datensätze zu überspringen. Zum Beispiel, wenn es "thsub": null ... findet, dann gehe zum nächsten – PaulTenna2000

Antwort

1

Ihre Schleife überprüft das Längenattribut von thsub. Wenn thsub null ist, dann wird Ihr Code versucht, ein Attribut (Länge) eines Null-Objekt zu überprüfen, die immer Ihren Code brechen .. Versuchen Sie, einen Scheck für die thsub Objekt Zugabe selbst vor der Überprüfung der Länge:

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

Arbeitsprobe:

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

+0

zurück, anstatt eine 0 zum Array hinzuzufügen, kann es nicht einfach ignoriert werden, wenn es null ist? – PaulTenna2000

1

Fügen Sie einfach eine Schutzbedingung hinzu, bevor Sie auf eine Eigenschaft als zugreifen. Ein Fehler wird ausgegeben, wenn Sie versuchen, Eigenschaften auf null oder undefined Objekte aufzurufen.

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

Im festen Anwendungsfall tsubs wird auf ein leeres Array gesetzt werden, wenn immer die Eigenschaft Zugriff einen falsy Wert zurückgibt.

+0

, anstatt eine 0 zum Array hinzuzufügen, kann es nicht einfach ignoriert werden, wenn es null ist? – PaulTenna2000

4

Es bricht, weil Sie thsub 's length Eigenschaft referenzieren. Da null keine Eigenschaften hat und nicht kann, wird dies einen Fehler auslösen. Dies kann in dieser Situation und in jeder anderen Situation, in der Sie NULL verwenden, einfach umgangen werden, indem Sie eine Art von Bedingung hinzufügen, die entweder Ihre Schleife unterbricht oder die Ausführung des Codes verhindert.

Hier ist ein einfaches Beispiel:

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

Notiere die hinzugefügt data.cars[l].thsub - falls dieser Wert null ist, wird die Bedingung falsch bewerten, und die Ausnahme verursachenden Code wird nie ausgeführt.

+0

Stellen Sie sicher, dass Sie 'data.cars [l] .thsub' überprüfen, bevor Sie' data.cars [l] .thsub.length' überprüfen. –

+0

@MattSpinks Danke, das soll ich tun, nicht sicher, wie ich es verpasst habe. – furkle

+0

anstatt eine 0 zum Array hinzuzufügen, kann es nicht einfach ignoriert werden, wenn es null ist? – PaulTenna2000

0

einfach überprüfen die thsub Variable zuerst:

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