集合简介
-
一种
无序且唯一
的数据结构。不关心顺序,集合里面的元素都是唯一的。
栈,队列,链表他们里面都有可能出现重复的数据,但是集合里面的元素是唯一的。
栈,队列,链表它们都有自己的顺序,但是集合是无序的。 -
Es6中新增了集合:名为
Set
, -
集合的常用操作:
去重复,判断某元素是否在集合中,求交集(几个集合里面都存在的元素)
-
对set数据结构,key和value是一样的。
// 1.去重复
const arr = [1,2,1,2]
const arrNew = [...new Set(arr)]
// new Set(arr): 去重复,把去重复的数据放在一个数组里面[...new Set(arr)]
console.log(arrNew) // [1,2]
// 2.判断某元素是否在集合中(直接使用set的has方法)
const set = new Set(arr)
const has = set.has(1) // true
// 3.求交集(set没有提供直接求交集的方法,那么我们直接把set转换成数组,利用数组的filter方法)
const set1 = {1,2}
const set2 = {2, 3}
const set22 = [...set2]
const set3 = set22.filter(item => set1.has(item))
console.log(set3) // 2
leetCode: 349两个数组的交集
题目:给2个数组,求交集。
const intersection = function(nums1, nums2) {
// return [...new Set(num1)].filter(n => new Set(nums2).has(n))
return [...new Set(num1)].filter(n => nums2.includes(n))
}
时间复杂度:O(n ^ 2)
空间复杂度:O(n)
使用Es6中的Set操作
- 使用Set对象:new,add,delete, has, size
- 迭代Set:多种迭代方法,Set与Array互转,求交集/差集
add
let mySet = new Set()
// 字符串
mySet.add('1')
mySet.add('5')
mySet.add('5')
// 数字
mySet.add(1)
mySet.add(5)
console.log(mySet) // {"1", "5", 1, 5}
// 对象 添加对象的时候,两次都生效,因为对象看起来是一个东西,但是两个对象在内存中存储的位置不一样,所以从本质上来说是2个不同的对象
mySet.add({a: "1", b: "2"})
mySet.add({a: "1", b: "2"}) // 第二次也能添加成功
console.log(mySet) // {"1", "5", 1, 5, {a: "1", b: "2"}, {a: "1", b: "2"}}
has
let mySet = new Set()
// 字符串
mySet.add('1')
mySet.has('1') // true
mySet.has(1) // false
delete
let mySet = new Set()
// 字符串
mySet.add('1')
mySet.delete('1') // true
console.log(mySet) // {size: 0}
mySet.size // 0
for of
// 方法1遍历:
let mySet = new Set()
mySet.add('4')
mySet.add('0')
mySet.add('6')
for (let item of mySet) {
console.log(item) // 4 0 6
}
// 方法2遍历:
let mySet = new Set()
mySet.add('4')
mySet.add('5')
mySet.add('6')
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, array) // 返回键值对
}
set转array
let mySet = new Set()
mySet.add('4')
mySet.add('5')
mySet.add('6')
转换为array
Array.form(mySet)
array转为set
const arr = [1,2,4]
new Set(arr)
求交集
let mySet = new Set()
mySet.add(2)
mySet.add('5')
const mySet2 = new Set([2,3])
const intersection = new Set([...mySet].filter(x => mySet2.has(x)))
求差集(在mySet中存在,但是mySet2不存在)
let mySet = new Set()
mySet.add(2)
mySet.add('5')
const mySet2 = new Set([2,3])
const difference = new Set([...mySet].filter(x => !mySet2.has(x)))
总结
技术要点:
-
一种
无序且唯一
的数据结构。不关心顺序,集合里面的元素都是唯一的。
栈,队列,链表他们里面都有可能出现重复的数据,但是集合里面的元素是唯一的。
栈,队列,链表它们都有自己的顺序,但是集合是无序的。 -
Es6中新增了集合:名为
Set
, -
集合的常用操作:
去重复,判断某元素是否在集合中,求交集(几个集合里面都存在的元素)
-
对set数据结构,key和value是一样的。