2017-07-27 1 views
0

rightArmy.pikeman ist ein Array, und die letzte console.log zeigt, dass der Wert "hp" von rightArmy.pikeman [0] "-80" ist. Das bedeutet, dass rightArmy.pikeman [0] EXISTIEREN MUSS. Unmittelbar davor prüfe ich den Wert von X mit console.log und es stellt sich heraus, dass es "1" ist. Und dann bekomme ich das:Javascript kann den Wert eines vorhandenen Objekts nicht lesen?

Warum konnte es nicht lesen, wie ist das überhaupt möglich? Ich habe Zeile 291 in meinem Code für Sie markiert.

Console zeigt:

java.js:289 1  X 

13: 53: 54,830 java.js: 290 -80

Antwort

1

Du bist wahrscheinlich diesen Fehler, weil, wenn x0 erreicht, zuerst die while-Schleife prüft für rightArmy.pikeman[x-1].hp, das ist das gleiche wie rightArmy.pikeman[-1].hp wenn x == 0. Arrays sind in der Regel nicht definiert im Index von -1.

eine einfache Lösung ist die Reihenfolge der Bedingungen in der while-Schleife zu ändern - while (rightArmy.pikeman[x-1].hp < 1 && x>0) werden werden while (x>0 && rightArmy.pikeman[x-1].hp < 1),

oder x initialisieren rightArmy.pikeman.length - 1 zu sein.

+0

Aber ich möchte, dass x nach jeder Iteration einen neuen Wert hat, deshalb verändere ich das Array. –

+0

dann können Sie stattdessen dies tun: 'while (rightArmy.pikeman.length> 0 && rightArmy.pikeman.hp> 1) ...' und verwerfen die x-Variable; es ist überflüssig. – nadavvadan

+0

Beide Lösungen, die Sie angeboten haben, ändern nichts, Programm wirft immer noch den gleichen Fehler. –

0

Der Schlüssel ist, wie @nadavvadan darauf hingewiesen, führt das Skript x-1, bevor es überprüft, ob x> 0, so dass ich das Problem wie folgt gelöst (weil Ändern von Aufträgen haben nicht funktioniert):

if (rightArmy.pikeman.length > 0) { 
    x = rightArmy.pikeman.length; 
    while (x>0) { 
     if (rightArmy.pikeman[x-1].hp < 1) { 
      rightArmy.pikeman.pop(); 
     } 
     x--; 
    } 
} 

Auf diese Weise befindet sich die Bedingung "x-1" innerhalb der Schleife und wird nicht getestet, wenn X = 0 ist.

+0

Beachten Sie, dass dieser Code möglicherweise anders als der Code ist, den Sie gepostet haben - Ihr alter Code bricht aus der Schleife, wenn es einen 'pikeman' mit' hp <1' trifft. dieses tut es nicht. dieser entfernt auch immer den letzten "Pikenier", auch wenn er nicht der mit dem niedrigen PS ist. Ich denke, das könnte nicht das erwartete Verhalten sein? Wenn alles, was Sie tun wollen, Pikenier mit 'hp <1 'herausfiltern und eins mit' hp> = 1' behalten, ist eine einfache Lösung das: 'var pikemenWithLotsOfHP = rightArmy.pikeman.filter (Funktion (Pikeman) {zurück pikeman.hp> = 1}) '' – nadavvadan

Verwandte Themen