2016-07-09 3 views
0

하지 않습니다 나는 초당 30 번 호출 내 업데이트 기능에 다음 코드를했다 : 그 전에자바 스크립트 Array.splice()는 아무것도

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

있습니다

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

자기 .runes.splice (i, 1)는 배열에 아무런 영향을주지 않습니다 ... 저는 어떤 값으로 설정됩니다. 난 그냥 룬 문자 배열에서 액티브하지 않은 룬을 제거하고 싶습니다. 어떤 아이디어?

+0

그런데, onDeactivate가 호출되고 있는데, 나는 그것을 테스트했습니다 ... –

+1

완전한 호기심에서 (나는 정확히 무슨 일이 벌어지는 지 알지만)'console.log (i)'는 당신에게 무엇을 보여 줍니까? –

+0

그것은 플레이어와 함께 가져갈 룬에 달렸습니다 ... 예를 들어 507을 보여주고 있습니다 ... 자기가 문제가 아닌지 궁금합니다. –

답변

4

두 가지 문제가 있습니다.

첫 번째로 onDeactivate을 호출 할 때 ithis.runes.length에 도달했으며 이는 console.log(i) 호출에서 볼 수 있습니다.

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

이 본질적 폐쇄의 내용에 대한 i의 값을 "잠금"것입니다 : 그 문제를 해결하기 위해 고전적인 수정 같은입니다.

두 번째 문제는 splice이 배열을 수정한다는 것입니다.

[rune_0, rune_1, rune_2] 

지금 rune_1이 비활성화됩니다라고, 그래서 코드 splice(1,1) 그것을 제거하기 위해 호출됩니다의 당신이 세 가지 룬 있다고 가정 해 봅시다.

[rune_0, rune_2] 

이제 rune_2이 비활성화되어 있으므로 splice(2,1)가 호출 : 이제 배열처럼 보인다. 그러면 배열에서 [2] 요소가 제거되지만 더 이상 요소가 없습니다.

[rune_0, rune_2] 

룬이 아직 있습니다.

당신이 뭔가를 할 수있는, 어레이에서 룬을 제거하려면 : toremove 당신이 사라 원하는 룬입니다

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

.