现有两个数组
let a = [101,201,601]
let b = [201,301,801]
1.求交集(交集元素由既属于集合a又属于集合b的元素组成)
方法1
let intersection = a.filter(v => b.includes(v)) // [201]
方法2
let intersection = Array.from(new Set(a.filter(v=> new Set(b).has(v))))
// [201]
方法3
let intersection = a.filter(v => new Set(b).has(v)) // [201]
方法4
let intersection = a.filter(function(v) { return b.indexOf(v) > -1 }) // [201]
过滤重复数据
如果数组中存在重复数据,也可用下面的方法去重:
let a = [101,201,601,201]
let b = [201,301,801]
let intersection = a.filter(function(v) {
return b.indexOf(v) > -1
}).filter(function (e,i,c) {
return c.indexOf(e) === i
}) // [201]
方法5
let intersection = []
a.forEach(function (item) {
b.forEach(function(v) {
if (item === v) {
intersection.push(v)
}
})
}) // [201]
总结: 如果数组中有重复数据,方法1、3、4、5会有重复数据出现
2.求并集 (并集元素由集合a和集合b中所有元素去重组成)
方法1
let union = a.concat(b.filter(v=> {
return !a.includes(v)
}
)) // [101, 201, 601, 301, 801]
方法2
let union = Array.from(new Set(a.concat(b))) // [101, 201, 601, 301, 801]
方法3
let union = a.concat(b.filter(function(v) {
return a.indexOf(v) === -1
})) // [101, 201, 601, 301, 801]
总结: 方法2写法最简单
3.求差集 (差集元素由集合a和集合b的并集减去集合a和集合b的交集)
方法1
let difference = a.concat(b).filter(v => !a.includes(v) || !b.includes(v))) // [101, 601, 301, 801]
方法2
let difference = Array.from(new Set(a.concat(b).filter(
v => !new Set(a).has(v) || !new Set(b).has(v)
))) // [101, 601, 301, 801]
方法3
let difference = a.filter(function(v) {
return b.indexOf(v) === -1
}).concat(b.filter(function(v) {
return a.indexOf(v) === -1
})) // [101, 601, 301, 801]
总结: 方法1写法最优。indexOf有个对NaN返回-1的问题,用到的话需要注意。