1.简单数组
(1)方法一
const a = [1, 2, 3, 4, 5];
const b = [2, 4, 6, 8, 10];
// 交集
let intersect = a.filter(item => b.includes(item));
// 差集
let minus = a.filter(item => !b.includes(item));
// 并集
let union = [...new Set(a.concat(b))];
// 补集
let complement = [...a.filter(item => !b.includes(item)), ...b.filter(item => !a.includes(item))];
console.log(intersect, minus, union, complement); // [2, 4] [1, 3, 5] [1, 2, 3, 4, 5, 6, 8, 10] [1, 3, 5, 6, 8, 10]
(2)方法二
let a = [1, 2, 3, 4, 5];
let b = [2, 4, 6, 8, 10];
let aSet = new Set(a);
let bSet = new Set(b);
// 交集
let intersect = a.filter(x => bSet.has(x));
// 差集
let minus = a.filter(x => !bSet.has(x));
// 并集
let union = Array.from(new Set([...a, ...b]));
// 补集
let complement = [...a.filter(x => !bSet.has(x)), ...b.filter(x => !aSet.has(x))];
console.log(intersect, minus, union, complement); // [2, 4] [1, 3, 5] [1, 2, 3, 4, 5, 6, 8, 10] [1, 3, 5, 6, 8, 10]
2.对象数组
data() {
return {
a: [
{ id: 1, name: 'name1' },
{ id: 2, name: 'name1' },
{ id: 3, name: 'name3' },
{ id: 4, name: 'name4' },
{ id: 5, name: 'name5' }
],
b: [
{ id: 2, name: 'name1' },
{ id: 4, name: 'name4' },
{ id: 6, name: 'name6' },
{ id: 8, name: 'name8' },
{ id: 10, name: 'name10' }
]
};
},
created() {
// 交集
console.log(this.intersectFn(this.a, this.b)); // [ { id: 2, name: 'name1' },{ id: 4, name: 'name4' }]
// 差集
console.log(this.minusFn(this.a, this.b)); // [ { id: 1, name: 'name1' },{ id: 3, name: 'name3' },{ id: 5, name: 'name5' }]
// 并集
console.log(this.unionFn(this.a, this.b));
// 补集
console.log(this.complementFn(this.a, this.b)); // [ { id: 1, name: 'name1' },{ id: 3, name: 'name3' },{ id: 5, name: 'name5' },{ id: 6, name: 'name6' },{ id: 8, name: 'name8' },{ id: 10, name: 'name10' }]
},
methods: {
// 交集
intersectFn(a = [], b = []) {
let result = a.filter(aItem => b.some(bItem => aItem.id === bItem.id && aItem.name === bItem.name));
return [...result];
},
// 差集
minusFn(a = [], b = []) {
let result = a.filter(aItem => b.every(bItem => aItem.id !== bItem.id || aItem.name !== bItem.name));
return [...result];
},
// 并集
unionFn(a = [], b = []) {
let arr = a.concat(b);
let result = arr.filter(
(item, index) => arr.findIndex(it => it.id === item.id && it.name === item.name) == index
);
return result;
},
// 补集
complementFn(a = [], b = []) {
let result1 = a.filter(aItem => b.every(bItem => aItem.id !== bItem.id || aItem.name !== bItem.name));
let result2 = b.filter(bItem => a.every(aItem => aItem.id !== bItem.id || aItem.name !== bItem.name));
return [...result1, ...result2];
}
}