JS 获取两个数组的交集,并集,差集,补集

1,109 阅读1分钟

项目中遇到了一个性能优化问题。有一个权限设置,点击是个弹窗。在关闭弹窗的时候要做一个判断: 如果权限设置发生了改变才去选择调接口。 需求很合理。看看如何来实现。

我们可以通过交集来检测数组之前和之后是否发生了改变,如果改变了再进行接口数据请求。

let arrA = [1, 2, 3, 4];
let arrB = [3, 4, 5, 6];
let intersection = arrA.filter(v => {return arrB.indexOf(v) > -1})
console.log('交集:', intersection) // [3, 4]

用filter过滤出数组A有并且数组B也有的数字 就是交集

let union = arrA.concat(arrB.filter(v => {return !(arrA.indexOf(v) > -1)}))
console.log('并集:', union) // [1, 2, 3, 4, 5, 6]

知道了交集获取的方法后。在filter过滤中加上一个'非!'。就可以获取到数组B有但是数组A没有的数字(差集)。然后在用concat拼接上数组A,就可以取到他们的并集

let differenceSetA = arrA.filter(v => {return !(arrB.indexOf(v) > -1)})
console.log('差集B-A:', differenceSetA) // [1, 2]
let differenceSetB = arrB.filter(v => {return !(arrA.indexOf(v) > -1)})
console.log('差集A-B:', differenceSetB) // [5, 6]

并集的时候提到了差集 那差集也附上代码

let complement = differenceSetA.concat(differenceSetB)
console.log('补集:', complement) // [1, 2, 5, 6]

补集就是去掉数组A和数组B共有的。 有两种方法,第一种就是上面的用concat拼接他们的差集 另一种就是从并集中去掉他们的交集.