我试图从数组中删除所有偶数,但它不会删除所有偶数。不知道为什么
var arr = [3,45,56,7,88,56,34,345];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
arr.splice(i,1);
}
}
console.log(arr);
给出了这个 - [3,45,7,56,345]而不是[3,45,7,345]
有什么想法吗?
答案 0 :(得分:7)
是的,这是因为当你从数组中拼出1个元素时,数组的长度会发生变化。试试这个 -
var arr = [3,45,56,7,88,56,34,345];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
arr.splice(i,1);
i = i-1; // SINCE YOU DELETED ONE ELEMENT,
// THE NEXT ELEMENT IN THE ARRAY GETS SHIFTED TO ONE POSITION ABOVE
//(SAY, FROM INDEX 4 TO 3). SO, YOU WILL NEED TO CHECK FROM INDEX 3 NOT 4
}
}
答案 1 :(得分:6)
当你删除88时,它后面的56向上移动一个位置,你的循环跳过它(它只是i++
)。
在迭代时更新数组时需要小心。
在这种情况下,您可以向后迭代数组(从最后开始,执行i--
)。根据splice的实现方式,这甚至可以更快一些(可能更少的数组元素被复制)。
答案 2 :(得分:6)
当您从中删除元素时,数组的长度会发生变化。
我建议使用Array.prototype.filter来实现这一点(对于IE&lt; = 8,它很容易填充):
var arr = [3,45,56,7,88,56,34,345];
arr = arr.filter( function is_odd(el) { return el % 2; } );
答案 3 :(得分:5)
您通过i循环遍历数组,每次都会递增。在它达到88之后,它将它拼接出来,并且仍然会增加数组,这将超过56,下一个我将参考34。
你需要在拼接时不增加i,或者当你拼接时,只需要i - ;
答案 4 :(得分:4)
arr.filter(function(item){return item % 2;}));