为什么0没有从列表中删除?

时间:2013-07-09 17:34:57

标签: 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]

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

每次从数组中删除一个值时,都会跳过跟随它的值,因为数组在每个拼接上都重新编制索引。你可以向后循环:

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

答案 2 :(得分:2)

它跳过0,因为splice重新索引数组。 用这个:

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;
    } 
}