无法从我的数组中删除偶数

时间:2014-08-15 00:06:18

标签: javascript arrays

我试图从数组中删除所有偶数,但它不会删除所有偶数。不知道为什么

 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]

有什么想法吗?

5 个答案:

答案 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;}));