操作还原
let list1 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'小王',id:126}]
let list2 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'张三',id:128}]
// 我们有个述求,就是把list2和 list1重复的数据从list2中删除
list2.forEach((el,index)=>{
if(list1.some(e=>{return e.id==el.id})){
list2.splice(index,1)
}
})
console.log(list2)
//输出结果 [{name: "翠花", id: 123}{name: "张三", id: 128}]
为什么会出现这种结果呢?
我们循环处理数组时删除数组中第一个元素的时候我们的数组长度是二。接着下一步运行,数组是从第二个元素开始操作,然而我们的第二个元素其实是我们的第三个元素,这样我们的 ‘翠花’就躲过了执行,原因找到了,我们的解决方案就好解决了
方法一 while 循环法
我们从最后一个开始操作,这样就没有元素可以躲了
let list1 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'小王',id:126}]
let list2 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'张三',id:128}]
// 我们有个述求,就是把list2和 list1重复的数据从list2中删除
let length = list2.length
// 我们从最后一个开始操作,这样就没有元素可以躲了
while(length--){
if(list1.some(e=>{return e.id==list2[length].id})){
list2.splice(length,1)
}
}
onsole.log(list2) // [{name: "张三", id: 128}]
方法二 filter 过滤法
我们不去处理原数组,把处理好的数组赋值给原数组
let list1 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'小王',id:126}]
let list2 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'张三',id:128}]
// 我们有个述求,就是把list2和list1重复的数据从list2中删除
list2 = list2.filter(el=>{ return list1.every(e=>{return e.id != el.id})})
console.log(list2)// [{name: "张三", id: 128}]
方法三 复制数组法
循环的时候我们用复制出来的数组,然后就处理原数组即可
let list1 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'小王',id:126}]
let list2 = [{name:'王二狗',id:122},{name:'翠花',id:123},{name:'张三',id:128}]
// 我们有个述求,就是把list2和 list1重复的数据从list2中删除
let list3 = [...list1]
list3.forEach((el,index)=>{
if(list1.some(e=>{return e.id==el.id})){
list2.splice(index,1)
}
})
console.log(list2)// [{name: "张三", id: 128}]
笔者方法先介绍到这来,其实方法不止这三种。我们只要知道为什么出现这种问题,然后想办法去规避即可
网友评论