在forEach循环里头使用splice()遇到的问题及解决方法

251 阅读1分钟

在forEach循环里头使用splice()遇到的问题及解决方法

在使用map、forEach等链式调用的方式去遍历数组集合时,不要在循环体中移除数组集合的成员,简单来说就是不要减少数组的长度,否则数组的指针会指向错误。

【1】例子: 循环arr数组,将item为1的元素从数组中删除

    let arr = [1, 1, 2]
    arr.forEach((item, index, arr) => {
      if (item == 1) {
        arr.splice(index, 1)
      }
    })
    console.log(arr) // [1, 2]

【2】结果:

循环之后打印 [1, 2], 还有一个1无法删除。

【3】原因分析:

①第一次forEach循环,arr是[1, 1, 2],index是0,item是1,if条件成立,使用splice删除了item1,arr变成[1, 2]

②第二次forEach循环,arr是[1, 2],index是1,item是2,if条件不成立,使用splice无法删除了第二个重复的1

③原因是使用splice容易使数组的index乱序。