我有一个循环通过一个数组和 removes 它的一些元素。
但是由于它从同一个数组中删除了它循环的元素,因此会产生一些问题。
我要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' ]
我该怎么做才能纠正这个问题?
答案 0 :(得分:6)
令人兴奋的伎俩:向后穿过阵列。
您正在进行&#34;并发修改&#34;场景(拼接位置i处的元素会改变其后所有元素的位置),所以请避免使用:
for(i=arr.length-1; i >=0; i--) {
// ...
if (shouldberemoved) {
arr.splice(i,1);
}
}
现在您可以删除任意数量的元素,而不会影响其前面的元素。
答案 1 :(得分:2)
为什么不以相反的顺序运行循环。
for (var i = Player.lenght; i < 0; i--)
然后,如果你删除,你将不会寻找这些元素。