集合
- 一种无序且唯一的数据结构,不能重复,区别于栈、队列、链表
- ES6中有集合,名为Set
- 集合常用的操作:去重、判断某元素是否在集合中、求交集
// 去重
const arr = [1,2,2]
const arr2 = [...new Set(arr)]
// 判断元素是否在集合中
const set = new Set(arr)
const has = set.has(1) // true
const has = set.has(4) // false
// 求set2与set的交集
const set2 = new Set([2, 3])
const set3 = new Set([...set].filter(item => set2.has(item)))
力扣 349:两个数组的交集
349 解题思路
- 用集合对nums1去重
- 遍历nums1,筛选出nums2也包含的值
// 时间复杂度O(m * n) 空间复杂度O(m)
function inetersection(nums1. nums2) {
return [...new Set(num1)].filter(n = > nums2.includes(n));
}
Set操作
-
使用Set对象:new、add、delete、has、size
-
迭代Set:多种迭代方法、set与array互转、求交集/差集
new、add
let mySet = new Set mySet.add(1) mySet.add(1) // 重复添加不会成功 mySet.add('some thing') let o = {a:1, b:2} mySet.add(o) mySet.add({a:1, b:2}) //此处添加看起来完全一样的对象,可以成功添加,基础知识请自行复习吧 mySet.has(1) // true mySet.has('some thing') // true mySet.has(o) // true
delete、size
mySet.delete(1) // 删除集合 删除前mySet.size = 4,删除后size = 3
迭代
for (let item of mySet) console.log(item) for (let item of mySet.keys()) console.log(item) for (let item of mySet.values()) console.log(item) // 前三项都打印 some thing、{a:1, b:2}、{a:1, b:2} for (let [key, value] of mySet.entries()) console.log(key, value) // key value的值是一样的,重复打印以上三项
Set 、 Array互转
// set转array const myArr = [...mySet] const myArr = Array.from(mySet) // array转set const mySet2 = new Set([1,2,3])
求交集
// 求两个集合的交集 并返回一个集合 const a = new Set([...mySet].filter(n = > mySet2.has(n)))
求差集合
// 即一个set中有,另一个set没有的集合 const a = new Set([...mySet].filter(n = > !mySet2.has(n)))