我正在测试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]
答案 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;
}
}