Javascript 当外部循环仍在同一阵列上运行时更改阵列

Javascript 当外部循环仍在同一阵列上运行时更改阵列,javascript,arrays,loops,Javascript,Arrays,Loops,我有一个循环,它穿过一个数组 它的一些元素 但由于它从循环的同一数组中删除元素,因此会产生一些问题 这里有播放器,我想从中删除播放器2 Players = []; Players.push('player1'); Players.push('player2'); Players.push('player2'); Players.push('player2'); Players.push('player3'); Players.push('player2'); Players.push('play

我有一个循环,它穿过一个数组 它的一些元素

但由于它从循环的同一数组中删除元素,因此会产生一些问题

这里有
播放器
,我想从中删除
播放器2

Players = [];
Players.push('player1');
Players.push('player2');
Players.push('player2');
Players.push('player2');
Players.push('player3');
Players.push('player2');
Players.push('player2');
Players.push('player2');

function check() {
    for (var i = 0; i < Players.length; i++) {
        if (Players[i] == 'player2')
            kick(Players[i])
    };
}

function kick(player) {
    for (var i = 0; i < Players.length; i++) {
        if (player == Players[i]) {
            Players.splice(i, 1);
            break;
        }
    };
}
输出

['player1','player3','player2','player2']


我能做些什么来纠正这个问题?

令人兴奋的技巧:向后运行数组

您遇到的是“并发修改”场景(在位置i处拼接出一个元素会更改其后面所有元素的位置),因此请避免:

for(i=arr.length-1; i >=0; i--) {
  // ...
  if (shouldberemoved) {
    arr.splice(i,1);
  }
}

现在,您可以删除任意数量的元素,而不影响前面的元素。

令人兴奋的技巧:向后遍历数组

您遇到的是“并发修改”场景(在位置i处拼接出一个元素会更改其后面所有元素的位置),因此请避免:

for(i=arr.length-1; i >=0; i--) {
  // ...
  if (shouldberemoved) {
    arr.splice(i,1);
  }
}

现在,您可以删除任意数量的元素,而不影响前面的元素。

为什么不按相反的顺序运行循环呢

for (var i = Player.lenght; i < 0; i--)
for(var i=Player.lenght;i<0;i--)

然后,如果删除,就不会查找这些元素。

为什么不按相反的顺序运行循环呢

for (var i = Player.lenght; i < 0; i--)
for(var i=Player.lenght;i<0;i--)

然后,如果删除,您将不会查找这些元素。

为什么不删除它们呢
if(Players[i]==“player2”){delete Players[i];}
请参阅以下答案:@feeela它使我的数组稀疏。>['player1','player3',,]搜索两次条目是多余的。在第一次搜索之后,你就知道东西的确切位置了。你为什么不把它们移走呢
if(Players[i]==“player2”){delete Players[i];}
请参阅以下答案:@feeela它使我的数组稀疏。>['player1','player3',,]搜索两次条目是多余的。在第一次搜索之后,你确切地知道东西在哪里。