数据格式:

let list = [{name:'x',ID:1},{name:'C',ID:2},{name:'V',ID:3},{name:'B',ID:4}]
let spliceIndex= [{name:'C',ID:2},{name:'V',ID:3}]

刚开始写的代码

list.forEach((item, index) => {
spliceIndex.forEach(it => {
if (it.ID === item.ID) {
list.splice(index, 1);
}
});
});

两个数组对象去除相同项,数组删除某一项_前端

原因

在A循环数组时,splice删除A数组中的某一些项(大于1),会改变length导致,删除行为还是根据索引来进行删除,最后的结果会出现异常

解决

自己尝试解决

let ids = [];
for (let index = 0; index < list.length; index++) {
for (let i = 0; i < spliceIndex.length; i++) {
if (spliceIndex[i].ID === list[index].ID) {
ids.push(list[index].ID);
break;
}
}
}
ids.forEach(item => {
let index = list.findIndex(it => it.ID === item);
list.splice(index, 1);
});

工具库loash

lodash.differenceBy(list, spliceIndex, 'ID')

demo

// The `_.property` iteratee shorthand.
_.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
// => [{ 'x': 2 }]

补充一个小知识点

continue 和 break 都是指跳出当前循环