两个对象数组对比,如果有相同的项就删除,不同就添加

两个对象数组对比,如果有相同的项就删除,不同就添加

var a =[{id: 1,content:'11'},{id: 2, content:'22'},{id: 3, content: '33'}]
var b = []
// 这个时候 a和b不同 我要把a数组的3个对象添加进b数组 得到
b = [{id: 1,content:'11'},{id: 2, content:'22'},{id: 3, content: '33'}]


var a =[{id: 1,content:'11'},{id: 2, content:'22'},{id: 3, content: '33'}]
var b = [{id: 1,content:'11'},{id: 2, content:'22'},{id: 3, content: '33'}]
// 这个时候 a和b相同 
//我需要把b数组中的所有相同项全部删除 得到
b = []

var a =[{id: 1,content:'11'},{id: 2, content:'22'},{id: 3, content: '33'}]
var b = [{id: 1,content:'11'},{id: 2, content:'22'}]
// 这个时候 a和b有相同项和不同项 
// 我需要把b数组中的相同项删除 不同项添加进去 得到
b = [{id: 3, content: '33'}]

请大佬帮帮忙

阅读 10.5k
4 个回答

针对这个问题,可以分步来解决,首先取出a中与b不相同的项,可以通过[].filter来找出这些元素,之后再取出b中与a中不同的项,将这两个的结果进行合并,即为所求。
参考:

a.filter((i) => !b.find((j) => j.id === i.id)).concat(
  b.filter((i) => !b.find((j) => j.id === i.id))
)

首先 a.filter((i) => !b.find((j) => j.id === i.id))筛选出a中与b中不同的元素,之后b.filter((i) => !b.find((j) => j.id === i.id))筛选出b中与a中不同的元素,之后concat合并两个结果

并集减去交集
不想写代码的话直接用lodash工具函数

一句话的事儿
补充:如为基本类型,可直接采用

a.filter(i => !b.includes(i)).concat(b.filter((i) => !a.includes(i)))

非基本类型,先转为基本类型

a = a.map(item => JSON.stringify(item))
b = b.map(item => JSON.stringify(item))
a.filter(i => !b.includes(i)).concat(b.filter((i) => !a.includes(i)))
新手上路,请多包涵

let all = [
{ a: 1 },
{ a: 2 },
{ a: 3 },
{ a: 4 },
{ a: 5 },
{ a: 6 },
{ a: 7 },
{ a: 8 },
{ a: 9 },
];

let filters = [
[{ a: 2 }, { a: 4 }, { a: 6 }, { a: 8 }],
[{ a: 2 }, { a: 3 }, { a: 4 }, { a: 5 }],
];

let filterArr: any = [];

filters.forEach((v, i) => {
filterArr[i] = all.filter((item: any) => !v.find((f) => f.a === item.a));
});

console.log(filterArr);

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏