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

lag*_*lex 1 javascript arrays loops

我有一个循环,通过一个数组并 从中删除一些元素.

但是因为它从循环的同一个数组中删除了元素,所以会产生一些问题.

在这里Players,我想从中删除一个player2

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;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

check();

console.info(util.inspect(Players));
Run Code Online (Sandbox Code Playgroud)

输出

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

我该怎么做才能纠正这个问题?

Mik*_*ans 6

令人兴奋的伎俩:向后穿过阵列.

你正在进行"并发修改"场景(拼接一个元素在位置i改变它后面的所有元素的位置),所以避免使用:

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

现在你可以删除任意数量的元素,而不会影响它前面的元素.