javascript Array.splice()什么都不做

时间:2016-07-09 10:02:52

标签: javascript arrays

我的更新功能中有以下代码,每秒调用30次:

        // 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++) ...

self.runes.splice(i,1)对数组没有任何作用...我被设置为某个值。我只是想从符文数组中删除不活跃的符文。任何想法?

1 个答案:

答案 0 :(得分: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是你想要的符文。