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

在我们日常敲代码的时候,常常会用到splice()方法来删除数组中的元素(就是以截取的方式),因为它会直接对数组进行修改。

在使用splice之前,必备条件是,要先有一个数组。

var arr =  new Array(1,2,3,4,5);  // 初始化一个数组
var deleteNumber = 3; // 要删除的元素

// 遍历数组
for(var i=0; i < arr.length; i++){
  if(arr[i] === deleteNumber){ // 如果和要删除的元素相等
      var num = arr.splice(i,1);
    console.log("成功删除" + num)
  } else {
   console.log(arr[i] + "未被删除");
  }
}

  

 

可以看到,3已经被成功删除,但是4跑哪去了呢???

前面说过,splice 是直接操作并修改数组的,所以当找到数字3时在循环中的 i 下标是2,而当删除数字3后,数组下标 i 位置中保存的数字变为了数字4,然后到了下一个循环 i 下标为3时,数组下标 i 位置中保存的数字是5,所以跳过了数字4,于是调试信息中没有可爱的数字4。。。原理就是这样子,是不是很绕。

那怎么解决漏掉了数字4这个问题呢???很简单,在使用 splice 的下一句,改一下循环变量值即可。。。

if(arr[i] === deleteNumber){
    var num = arr.splice(i,1); //从i位置开始删除一个数字
    i = i -1;  // 解决方案
}

但是还有一种解决方法就是从后往前遍历,但是本人如果没有条件限制的话更喜欢用forEach进行遍历,所以 i = i -1这种解决方式还是挺方便的。

部分内容转自 https://blog.csdn.net/a727911438/article/details/55224532?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.opensearch_close&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.opensearch_close

原文地址:https://www.cnblogs.com/lovekiku123/p/13518396.html