【JavaScript】经典练习题09(交集、并集、差集)

138 阅读2分钟

给定两个数组,写一个方法来计算它们的交集?

function intersection (...arg) {
    let a0 = Array.from(new Set (arg [0]));//对第一个数组进行去重复制
    let a1 = Array.from(new Set (arg [1]));//对第二个数组进行去重复制
    return a0. filter (v => a1. includes(v));
    //对第一个数组里的每一项v运行函数:a1.includes(v),a1中是否含有v,如果含有,这返回true,组成新的数组
}

Array.from():对现有数组执行浅复制;

new Set():用来去重,每个值在set中只出现一次;

filter():对数组每一项都运行传入的函数,函数返回true的项会组成数组之后返回

使用一行代码的情况:

简单的数组

let a=[1,2,3,4,5];
let b=[1,2,3,4,5,6,7,8,9];

并集

 let arr = Array.from(new Set([...a, ...b])); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9]

交集

let arr = Array.from(new Set([...b].filter(x => a.has(x))));// [ 1, 2, 3, 4, 5 ]

差集

let arr = Array.from(new Set([...b].filter(x => !a.has(x)))); //[ 6, 7, 8, 9 ]

数组对象

let a = [{ id1a123b1234 },    
         { id2a123b1234 }];
let b = [{ id1a123b1234 },   
         { id2a123b1234 },    
         { id3a123b1234 },                
         { id4a123b1234 }];  

并集

let obj1 = {},//通过ID去重
markerAray = a.concat(b).reduce((cur, next) => {   
    obj1[next.id] ? "" : obj1[next.id] = true && cur.push(next);  return cur;   
    }, []) //设置cur默认类型为数组,并且初始值为空的数组 
//markerAray  [ { id: 1, a: 456, b: 1234 }, { id: 2, a: 123, b: 1234 }, { id: 3, a: 123, b: 1234 }, { id: 4, a: 123, b: 1234 }]

concat():连接两个或更多的数组,并返回结果。

reduce():将数组元素计算为一个值(从左到右)

交集

 let arr = [...b].filter(x => [...a].some(y => y.id === x.id));
 //[ { id: 1, a: 123, b: 1234 }, { id: 2, a: 123, b: 1234 } ]

some():对数组每一项都运行传入的函数,如果有一项函数返回true,则这个方法返回true。

差集

 let arr = [...b].filter(x => [...a].every(y => y.id !== x.id));
 // [ { id: 3, a: 123, b: 1234 }, { id: 4, a: 123, b: 1234 } ]

every():对数组每一项都运行传入的函数,如果每一项函数返回true,则这个方法返回true。