解决删不干净的bug

94 阅读1分钟
例如:我要删除一个数组中的偶数
给出以下代码
var nums = [2, 2, 4, 7, 3, 8];
for (var i = 0; i < nums.length; i++) {
    if (nums[i] % 2 === 0) {
        nums.splice(i, 1);
    }
}
console.log(nums); // [ 2, 7, 3 ]

/* 存在bug原因:
第一次循环:
    数组:2, 2, 4, 7, 3, 8
    索引:0  1  2  3  4  5
    解释:第一个数组2显然是偶数,删掉之后,数组变为2, 4, 7, 3, 8
第二次循环:
    数组:2, 4, 7, 3, 8
    索引:0  1  2  3  4
    解释:这一次循环,就是从索引1开始遍历,直接跳过了索引0位置处的数字2
*/

// 解决方案1:知道原因过后,每次删掉过后,把i减1
/* var nums = [2, 2, 4, 7, 3, 8];
for (var i = 0; i < nums.length; i++) {
    if (nums[i] % 2 === 0) {
        nums.splice(i, 1);
        i--;
    }
}
console.log(nums); // [ 7, 3 ] */

// 解决方案2:倒着遍历数组,从数组的最后一位数字开始删
var nums = [2, 2, 4, 7, 3, 8];
for (var i = nums.length - 1; i >= 0; i--) {
    if (nums[i] % 2 === 0) {
        nums.splice(i, 1);
    }
}
console.log(nums); // [ 7, 3 ]