JS 求数组交集

3,056 阅读1分钟

前言: 某位名人说过(bu ke kao zheng ,haha : )遇到问题多总结,并且思考更多 更好的解决方法 。 没错,所以我自己总结了一下,在这里分享给大家.

题目:给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]

输出:[2]

Set

利用 Set去除本身的重复,然后合并

let intersection = (arr1,arr2) =>{
    let res = []
    let a1 = new Set(arr1)
    let a2 = new Set(arr2)
    a1.forEach(item => {
        if(a2.has(item)){
            res.push(item)
        }
    })
    return res
}
console.log('intersection : ', intersection(nums1,nums2)); //[2]

filter

用 JavaScript的 filter 数组方法来合并两数组

let intersection = (arr1,arr2) =>{
    let a1 = new Set(arr1)
    let a2 = new Set(arr2)
    return [...a1].filter(item => a2.has(item))
}
console.log('intersection : ', intersection(nums1,nums2)); //[2]

Object 键值对

存储为对象,先存入nums1,然后存入nums2的时候进行判断

let intersection = (arr1,arr2) =>{
    let hash = {}
    for (let i=0;i<arr1.length;i++){
        if(!hash[arr1[i]]){
            hash[arr1[i]] = 1
        }
    }
    let res = []
    for(let j=0;j<arr2.length;j++){
        if(hash[arr2[j]]){
            // 对于 arr2 的重复值只 push 一次
            delete hash[nums2[j]]
            res.push(arr2[j])
        }
    }
    console.log('hash last: ', hash);
    return res
}
console.log('intersection : ', intersection(nums1,nums2));

: 这种方法对于数字和字符串相同的话会有 bug,比如

let nums1 = [1,2,2,1,'1','2']

let nums2 = [2,2,'2']

// intersection(nums1,nums2) // [2]

我们可以发现,是有问题的,因为 2 和 '2' 是不同的,但是这种方法会判断为同一个值,

这是因为对象的键值只能是字符串,但是我们可以使用 typeof item + item 拼成字符串作为 key 值来避免这个问题,可以参考我的文章 数组去重里的 Object 方法

includes

ES7 Array.prototype.includes 还比较简洁的

 let intersection = (arr1,arr2) =>{

// 去除重复元素

 	a = new Set(arr1)

 	b = new Set(arr2)

	return  [...a].filter( v => [...b].includes(v))

}

 console.log('intersection : ', intersection(nums1,nums2));

结语

今天的分享就到这里啦,大家也可以思考用对应方法求 差集、并集,也欢迎和我讨论

作者:陈有味

email:chenuvi@outlook.com

码字不易,转载、引用请注明出处