集合是什么?
一种无序且唯一的数据结构
ES6中有集合,名为Set
集合的常用操作:去重、判断某元素是否在集合中、求交集
// 去重
const arr = [1, 1, 2, 2];
const arr2 = [...new Set(arr)];
// 判断元素是否在集合中
const set = new Set(arr);
const has = set.has(3);
// 求交集
const set2 = new Set([2, 3]);
const set3 = new Set([...set].filter(item => set2.has(item)));
LeetCode:349.两个数组的交集
输入:nums1 = [1,2,2,1],nums2 = [2,2]
输出:[2]
解题思路
求交集且无序唯一
使用集合
解题步骤
用集合对nums1去重
遍历nums1,帅选出nums2中包含的值
时间复杂度O(m * n),空间复杂度O(m)
m是去重后nums1的长度,n是nums2的长度
nums1和nums2都是已有的存储,额外临时的存储是num1去重后的长度
前端与集合:使用ES6的Set
Set操作
使用Set对象:new、add、delete、has、size
迭代Set:多种迭代方法、Set与Array互转、求交集/差集
let mySet = new Set();//new
mySet.add(1);//add
mySet.add(5);
mySet.add(5);//因为唯一性,mySet只会有一个5
mySet.add('some text');
let o = { a: 1, b: 2 };
mySet.add(o);
mySet.add({ a: 1, b: 2 });//存储地址不一样,会被添加
const has = mySet.has(o);//has
//size为5
mySet.delete(5);//delete
//size为4
//多种迭代方法
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);
for(let [key, value] of mySet.entries()) console.log(key, value);//key和value一样
//Set > Array
const myArr = [...mySet];
const myArr = Array.from(mySet);
//Array > Set
const mySet2 = new Set([1,2,3,4]);
//求交集(mySet和mySet2中都有的)
const intersection = new Set([...mySet].filter(x => mySet2.has(x)));
//求差集(mySet中有,mySet2中没有的)
const difference = new Set([...mySet].filter(x => !mySet2.has(x)));
思考题
1、在你的实际工作中使用集合完成一次去重操作
2、了解数据库中的 join 操作符吗?inner join 属于集合中的哪个操作?