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]
4

3 回答 3

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; });
于 2013-07-09T17:41:23.973 回答
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); 
    } 
}
于 2013-07-09T17:41:57.507 回答
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;
    } 
}
于 2013-07-09T17:46:16.623 回答