use*_*760 7 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]
Run Code Online (Sandbox Code Playgroud)
And*_*nes 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; });
Run Code Online (Sandbox Code Playgroud)
每次从数组中删除一个值时,都会跳过跟随它的值,因为数组在每个接头上都重新编制索引.你可以向后循环:
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);
}
}
Run Code Online (Sandbox Code Playgroud)