Javascript 为什么不从列表中删除0?

Javascript 为什么不从列表中删除0?,javascript,arrays,modulo,Javascript,Arrays,Modulo,我正在测试splice在遍历数组时是如何工作的,不明白为什么0会留在列表中 var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; for (var i = 0; i < array.length; i++) { if (array[i]%2 == 0) { array.splice(i,1); } } //0 % 2 == 0 is true, and yet //array = [5, 9, 0, 1, 3, 7]

我正在测试
splice
在遍历数组时是如何工作的,不明白为什么0会留在列表中

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
    } 
}

//0 % 2 == 0  is true, and yet
//array = [5, 9, 0, 1, 3, 7]
var数组=[2,5,9,14,0,1,3,6,7];
对于(var i=0;i
0被跳过

在遍历数组时,您正在对其进行变异(更改)。这是一个不可能的编程

让我们穿过

i=0,2是偶数并被拼接的,您的数组现在是[5,9,14,0,1,3,6,7]

i=1,我们甚至没有检查索引0中的5。。。我们现在检查9,这很奇怪,很好

i=2和14是偶数并被拼接的,您的数组现在是[5,9,0,1,3,6,7]

i=3,0被跳过(因为0现在在索引2中),1是奇数,很好

i=4是奇数

i=5是均匀的,并进行拼接

i=6是奇数

你真正想要的是这个

Array.prototype.filter = function(func) {
  var result = new Array();
  for (var i = 0; i < this.length; ++i) 
    if (func(this[i]))
      result.push(this[i]);
  return result;
}

values = [2, 5, 9, 14, 0, 1, 3, 6, 7];
odd_only = values.filter(function(x) { x % 2 != 0; });
Array.prototype.filter=函数(func){
var result=新数组();
对于(变量i=0;i
每次从数组中删除值时,都会跳过它后面的值,因为数组会在每个拼接处重新编制索引。您可以改为反向循环:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = array.length-1; i >= 0; i--) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
    } 
}

它跳过0,因为拼接重新索引数组。 使用以下命令:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7];
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
        array.splice(i,1); 
        i = i - 1;
    } 
}
var数组=[2,5,9,14,0,1,3,6,7];
对于(var i=0;i
您没有迭代所有值,您必须向后循环,因为数组在每个拼接上都重新编制了索引。有一种感觉可能会发生,但测试用例设置得不够好。。。但是关于向后迭代+1的好提示!想要奇数整数吗?[2,5,9,14,0,1,3,6,7].过滤器(/./.test,/[13579]$/)是的,如果我在一卷中设置更多的偶数,它会非常明显。从bfavaretto的回复来看,如果我向后迭代,我似乎可以通过。。。没什么害处(?)在本例中,您可以向后迭代,但在迭代过程中对数组进行变异仍然不是一种很好的编程实践
if(!(filter in array.prototype))
它会迭代整个数组吗?它会迭代整个数组,并且还会处理第一个和最后一个元素。在迭代过程中对数组进行变异不是很好的编程实践