简单数组及对象数组取交集,差集,并集,补集的方法

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];
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值