1. 求交集(从2个数组中找到相同的元素, 组成新数组, 注意去重):
1) Set+filter+includes
// 求交集:
const arr1 = [0, 1, 2]
const arr2 = [3, 2, 0]
function intersectSet(arr1, arr2) {
return [...new Set(arr1)].filter(item=>arr2.includes(item))
}
const values = intersectSet(arr1, arr2)
console.log(values, ':values') // [0, 2]
2)Map+forEach+filter
// 求交集
// 引用类型
function intersect(arr1, arr2, key) {
const map = new Map()
arr1.forEach(val => map.set(val[key], val[key]))// map.set第二个参数不传相当于传了undefined
console.log(map, ':map====')
return arr2.filter(val => map.has(val[key]))
}
// 原始数据类型:
function intersectBase(arr1, arr2) {
const map = new Map()
arr1.forEach(val => map.set(val, val))// map.set第二个参数不传相当于传了undefined
console.log(map, ':map====')
return arr2.filter(val => map.has(val))
}
注意事项: 大量数据时, includes查找太耗性能, 如果已经有Set和Map存下的数据, 使用has方法查找性能会稍好一点
2. 求差集
很简单, 和上面的求交集的做相反的判断就行了
// 求差集---
// 引用类型
function difference(arr1, arr2, key) {
const map = new Map()
arr1.forEach(val => map.set(val[key], val[key]))// map.set第二个参数不传相当于传了undefined
console.log(map, ':map====')
return arr2.filter(val => !map.has(val[key]))
}
// 原始数据类型:
function differenceBase(arr1, arr2) {
const map = new Map()
arr1.forEach(val => map.set(val, val))// map.set第二个参数不传相当于传了undefined
console.log(map, ':map====')
return arr2.filter(val => !map.has(val))
}
const a1 = [{p:0},{p:1},{p:2}]
const a2 = [{p:3},{p:2},{p:1}]
console.log(difference(a1, a2, 'p'))
const arr1 = [0, 1, 2]
const arr2 = [3, 2, 0]
console.log(differenceBase(arr1, arr2))