简单数组
如果数组中仅是字符串和数值
- es5
var a = [1,2,3], b = [2,3,4,5];
// 交集---[2,3]
var intersection = a.filter(item => b.indexOf(item) > -1)
// 并集---[1,2,3,4,5]
var union= a.concat(b.filter(item => a.indexOf(item) === -1))
交集的逻辑就是将b在a里边过滤一下,只需要a里边找不到的即可。并集的逻辑类似,使用concat方法将a里边没有的数据合并到a里边,因此在过滤b的时候要判断a里边能不能找到索引。
- es6
var a = [1,2,3], b = [2,3,4,5];
// 交集---[2,3]
var intersection =a.filter(item => new Set(b).has(item))
// 并集---[1,2,3,4,5]
var union= Array.from(new Set([...a, ...b]))
这里使用了es6语法中的Set类型,其类似于数组,但成员都是唯一,因此很方便与去重。而且还能够使用其内置的方法。
在获取并集的时候,使用了数组的from方法,将set类型转为数组。
数组对象
var c = [{id: 1, name: 'jack'},{id: 2, name: 'bob'}];
var d = [{id: 2, name: 'bob'},{id: 3, name: 'Jessica'}];
// 交集---[{id: 2, name: 'bob'}]
var intersection = [];
for (let i = 0; i< c.length; i++) {
for (let j = 0; j< d.length; j++ ) {
if (c[i].id === d[j].id){
intersection.push(c[i])
}
}
}
// 并集
var union = [...c, ...d]
for (let i =0; i< c.length; i++) {
for (let j =0; j< d.length; j++) {
if (c[i].id === d[j].id) {
union1.splice(union1.findIndex(item => {return c[i].id === item.id}),1)
}
}
}
交集的逻辑是双重循环去判断对象内的唯一值是否相等,然后将相等的数据放到数组中。并集的逻辑类似,也是双重循环去判断二者,但是在刚开始就将两个数组进行展开,因此在判断两者有一样的数据时,要通过splice方法去删除当前值。