删除数组内元素 失败 存在残留数据 splice 删除成功 但结果不正确
需求 : 数组中含有对象,对比值与数组中对象某元素是否相等,相等删除,不相等保留。
踩坑原因:忽略长度,如果改变了长度 可能此时的对象已经不是原本的对象; 懂得直接看解决方法;不懂得接着往下
- 懂得直接看解决方法;不懂得接着往下
let arr:[{index:’2’,name:’你好’},{index:’2’,name:’世界’},{index:’3’,name:’啦啦’},{index:’2’,name:’看见’}]
let diff:2;
// index == 2 删除
// index !=2 保留
- 文章通过 forEach和for循环 进行讲解
- 错误写法
for (let i = 0; i <= this.arr.length; i++) {
console.log(i) // 0,1 不会再执行
this.arr[i].index == diff ? this.arr.splice(i,1) :console.log(i)
}
打印结果:
- 错误讲解
splice 会改变原本数组的长度 也就是 会改变角标所指向的内容
第一次执行 删除 i= 0
{index: “2”, name: “你好”} // 被删除
第二次执行完 i= 1
此时 arr[1] = {index: “3”, name: “啦啦”} //保留
第二次执行完 i= 2
{index: “2”, name: “看见”} // 被删除
故结束循环
打印结果
arr:[{index:’2’,name:’世界’},{index:’3’,name:’啦啦’}]
- 解决办法
在循环前新建一个临时数组 用于存储要保留的内容,只要把需要的内容push到临时数组,这是需要筛选的数组长度内容角标等都不会被改变
let temporary = [];
for (let i = 0; i <= arr.length; i++) {
arr[i].index != diff ? temporary.push(arr[i]) : console.log('...')
console.log(temporary);
};
打印结果
forEach同理
- 解决方法二 (个人不推荐):
手动更改 i 角标 的指向;当符合条件时删除 并将 i - 适当数量 使得 角标的指向是正常的