splice()方法在for循环中可能会遇到的坑

2018-04-22  本文已影响148人  淡然7698
var arr = [1, 2, 3, 4, 5];     //初始化数字集合  
var remove_number = 3;    //要被删除的数字  
  
//遍历数组  
for(var i=0; i<arr.length; i++){  
    if(arr[i] === remove_number){   //如果找到要被删除的数字所在的数组下标  
        var num = arr.splice( i, 1 );   //从i位置开始删除1个数字  
        console.log("成功删除 "+num);    //输出被删除的数字  
    }  
    else{  
        console.log(arr[i]+" 未被删除");    //如果i下标的数组元素不是需要被删除的数字,就输出数字  
    }  
} 

因为splice 是直接操作并修改数组的,所以当找到数字3时在循环中的 i 下标是2,而当删除数字3后,数组下标 i 位置中保存的数字变为了数字4,然后到了下一个循环 i 下标为3时,数组下标 i 位置中保存的数字是5,所以跳过了数字4,于是调试信息中没有数字4.。。。

一个解决方法 从最后往前循环

for (var i = arr.length - 1; i >= 0; i--) {
       if(arr[i] === remove_number){   //如果找到要被删除的数字所在的数组下标  
        var num = arr.splice( i, 1 );   //从i位置开始删除1个数字  
        console.log("成功删除 "+num);    //输出被删除的数字  
    }  
    else{  
        console.log(arr[i]+" 未被删除");    //如果i下标的数组元素不是需要被删除的数字,就输出数字  
    }  
 }
上一篇下一篇

猜你喜欢

热点阅读