Skip to content

JS常用的求交集、并集、差集的方法

普通数组

示例数组

js
let a = [1, 2, 3];
let b = [4, 3, 2];

一、并集(A∪B)

js
//方法一:
;
// 虽然 NaN 和 NaN 不相等,但是在 Set 集合里面只会存在一个
// undefined 和 Infinity 在 Set 集合里面也只会存在一个
let a = [1, 2, 3, NaN];
let b = [2, 4, 5, NaN];
const union  =  (arr1,arr2) => [...new Set([...arr1, ...arr2])]// [1, 2, 3, NaN, 4, 5]

//方法二:
const union = (arr1,arr2) =>  Array.from(new Set(arr1.concat(arr2)))

//先b筛选a中没有的,再连接数组
const union = (arr1,arr2) => arr1.concat(arr2.filter(val => !arr1.includes(val)))
const union = (arr1,arr2) => arr1.concat(arr2.filter(val=> arr2.indexOf(val) === -1));

二、交集(A∩B)

js
let intersection  = (arr1,arr2) => [...new Set(arr1.filter(val => arr2.includes(val)))];//[2, NaN]

三、差集(A-B)

js
// 差集(a 相对于 b 的差集) 属于a不属于b的元素
let difference  = (arr1,arr2) => [...new Set(arr1.filter(val => !arr2.includes(val)))];
 
//返回a与b数组区别的集合(交集取反) 
let a = [1, 2, 3];
let b = [2, 4, 5];
let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v));
let difference = a.concat(b).filter(v => !(a.includes(v) && b.includes(v)));
console.log(difference)// [1,3,4,5]

//方法二:先转为 Set
let aSet = new Set(a);
let bSet = new Set(b)
//  
let difference = Array.from(new Set(a.concat(b).filter(v => !aSet.has(v) || !bSet.has(v))));
console.log(difference) // [1,3,4,5]

对象数组

示例数组

js
let a=[
    {id:'01',name:'product01'},
    {id:'02',name:'product02'},
    {id:'03',name:'product03'},
    {id:'04',name:'product04'},
    {id:'05',name:'product05'}
    ];
let b=[
    {id:'03',name:'product03'},
    {id:'06',name:'product06'},
    {id:'07',name:'product07'},
    {id:'08',name:'product08'},

];

一、并集(A∪B)

js
// 用额外对象记录当前项 id 相同的是否收集,此 id 未收集,则进行收集
//写法一:
const union = (arr1,arr2) =>{
    let obj = {};
    let arr = arr1.concat(arr2);
   return arr.reduce( (pre,cur) => {
        if(!obj[cur.id]){
            pre.push(cur)
            obj[cur.id] = true
        }
        return pre
    },[])
}

//写法二:
const union = (arr1,arr2)=>{
  let arr = arr1.concat(arr2)
  let res = []
  for(let i = 0; i < arr.length; i++){
    if(res.findIndex(item => item.id === arr[i].id)===-1){
      res.push(c[i])
    }
  }
  return res
}
  //简化
  //判断目标在数组中相同的 id 是否存在
const isExist = (arr,target,attr) => arr.findIndex(item => item[attr] == target[attr]) != -1 
//合并数组并遍历,判断新数组不存在当前项,则收集
const union = (arr1,arr2) =>  arr1.concat(arr2).reduce((pre,cur) => isExist(pre,cur,'id') ? pre  : [...pre,cur],[])

二、交集(A∩B)

js
//方法一:
const intersection = (arr1,arr2) => {
    const aids = a.map(item => item.id)
    return arr2.filter(item => aids.includes(item.id))
}
//方法二:
const intersection = (arr1,arr2) =>  arr1.reduce((pre,cur) => arr2.findIndex(item => item.id == cur.id) != -1 ? [...pre,cur] : pre,[])

三、差集(A-B)

js
//找出arr1数组中,arr2数组没有的对象
 const diff = (arr1, arr2) =>  arr1.filter(i => arr2.every(j => i.id !== j.id))
 const diff = (arr1, arr2) =>  arr1.filter(i => !arr2.some(j => i.id === j.id))

用心去做高质量的内容网站,欢迎 star ⭐ 让更多人发现