2016-07-09 15 views
0

Ich habe den folgenden Code in meinem Update-Funktion, die 30-mal pro Sekunde aufgerufen wird:Javascript Array.splice() tut nichts

 // Checking collision between rune and the players: 
     for(var j = 0; j < this.players.length; j++) { 
      if(this.checkCollision(this.players[j], this.runes[i])) { 
      this.runes[i].activate(this.players[j]); 
      this.runes[i].isHidden = true; 
      this.runes[i].onDeactivate = function() { 
       console.log(i); 
       self.runes.splice(i, 1); 
      } 
      } 
     } 

vor, dass ich:

for(var i = 0; i < this.runes.length; i++) ... 

die Selbst .runes.splice (i, 1) tut nichts zu einem Array ... ich werde auf einen Wert gesetzt. Ich möchte nur die nicht aktive Rune aus einem Array von Runen entfernen. Irgendwelche Ideen?

+0

übrigens onDeactivate wird aufgerufen, ich habe das getestet ... –

+1

Aus reiner Neugier (ich weiß genau, was los ist), aber was zeigt dir console.log (i)? –

+0

es hängt davon ab, welche Rune ich mit Spieler nehme ... zum Beispiel zeigt es jetzt 507 ... Ich frage mich, ob Selbst kein Problem ist –

Antwort

4

Sie haben zwei Probleme.

Zum einen zum Zeitpunkt onDeactivate des Aufrufs, i wird this.runes.length erreicht haben, und das ist, was Sie in der console.log(i) Anruf sehen werden. Die klassische Update, das Problem zu lösen, ist so etwas wie:

(function(i) { 
    // code that relies on i 
})(i); 

Dies wird im Wesentlichen „sperren“, um den Wert von i für den Inhalt dieses Verschlusses.

Das zweite Problem ist, dass splice das Array ändert, und Sie nicht dafür entgegenkommen. Angenommen, Sie haben drei Runen haben:

[rune_0, rune_1, rune_2] 

sagen Jetzt rune_1 deaktiviert wird, so dass der Code splice(1,1) heißt es zu entfernen. Jetzt ist Ihr Array wie folgt aussieht:

[rune_0, rune_2] 

jetzt rune_2 deaktiviert, so splice(2,1) genannt wird. Das entfernt das [2] Element aus dem Array ... aber es gibt keinen mehr.

[rune_0, rune_2] 

Die Rune ist immer noch da.

Um eine Rune aus dem Array zu entfernen, können Sie wie etwas tun:

this.runes = this.runes.filter(function(rune) {return rune !== toremove;}); 

Wo toremove ist die Rune Sie weg wollen.