解决 JavaScript 中数组 splice 方法删除元素被跳过或只删除部分元素

本文探讨了在JavaScript中对数组遍历时,如何避免splice方法导致的索引错乱。通过对比实时同步索引、倒序遍历、filter替代等方案,展示了如何正确地移除数组中符合条件的元素,确保删除效果的准确性和效率。
摘要由CSDN通过智能技术生成

一、问题说明

对数组遍历,使用 splice 方法移除符合条件的元素。由于 splice 方法改变原数组的长度,但循环中 i 仍然读取原始数组长度,造成跳过或只删除数组中符合条件的部分元素。

演示 Demo

const studentList = [
  { name: 'Tom', grade: 55 },
  { name: 'Jane', grade: 59 },
  { name: 'Murphy', grade: 80 }
]

for(let i = 0; i < studentList.length; i++) {
  if (studentList[i].grade < 60) {
    studentList.splice(i, 1)
  }
}

打印结果

二、方案一

实时同步索引法。对数组遍历,当对符合条件的元素执行 splice 方法,进行 i-- 操作,使读取的索引跟 splice 后的数组同步。

演示 Demo

const studentList = [
  { name: 'Tom', grade: 55 },
  { name: 'Jane', grade: 59 },
  { name: 'Murphy', grade: 80 }
]

for(let i = 0; i < studentList.length; i++) {
  if (studentList[i].grade < 60) {
    studentList.splice(i, 1)
    i--
  }
}

打印结果

三、方案二

倒序遍历法。因 splice 方法会直接操作原数组,导致数组宽度变小,后面的元素往前推。因此,从后往前读取,无论是否满足删除条件,每次循环都是读取到正确的数组项值。

演示 Demo

const studentList = [
  { name: 'Tom', grade: 55 },
  { name: 'Jane', grade: 59 },
  { name: 'Murphy', grade: 80 }
]

for(let i = studentList.length - 1; i >= 0; i--) {
  if (studentList[i].grade < 60) {
    studentList.splice(i, 1)
  }
}

打印结果

四、方案三

filter 代替法。与 splice 方法不同,filter 方法并不会更改原数组,而是满足条件的元素组成一个新数组返回。

演示 Demo

const studentList = [
  { name: 'Tom', grade: 55 },
  { name: 'Jane', grade: 59 },
  { name: 'Murphy', grade: 80 }
]

const goodStudentList = studentList.filter(student => {
  return student.grade > 60
})

打印结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值