2016-07-09 3 views
0

я следующий код в моей функции обновления, которая называется 30 раз в секунду:Javascript 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) ничего не делает для массива ... i устанавливается на некоторое значение. Я просто хочу удалить неактивную руну из массива рун. Есть идеи?

+0

Кстати, onDeactivate вызывается, я тестировал это ... –

+1

Из явного любопытства (я точно знаю, что происходит), но что делает 'console.log (i)' показывает вам? –

+0

это зависит от того, какую руну я беру с игроком ... например, теперь он показывает 507 ... Интересно, не является ли самосознание –

ответ

4

У вас есть две проблемы.

Во-первых, в момент вызова onDeactivate, i достигнет this.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] 

Руна все еще существует.

Чтобы удалить руну из массива, вы можете сделать что-то вроде:

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

Где toremove это руна вы хотите ушел.

Смежные вопросы