在同一数组上运行外部循环时更改数组

Altering the array while an outer loop is still running on that same array

本文关键字:数组 循环 外部 运行      更新时间:2023-09-26

我有一个遍历数组的循环,并且删除其中的一些元素。

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

在这里,我有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;
        }
    };
}

check();
console.info(util.inspect(Players));

输出

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

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

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

您遇到了"并发修改"场景(拼接出位置 i 处的元素会更改其后所有元素的位置),因此请通过以下方式避免这种情况:

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

现在,您可以根据需要删除任意数量的元素,而不会影响其前面的元素。

为什么不以相反的顺序运行循环。

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

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