ES6 Set 与 Map 数据结构(复习/面试)
目录
1. Set
2. WeakSet
3. Map
4. WeakMap
1. Set
-
特性:唯一,不重复,成员值不限
Set
的原理是:如果传入的数组,那么它会遍历数组, 传入的是字符串,字符串会被自动拆分为单个字符 ,并逐个添加到Set
-
去重写法 : [...new Set(array)] 去重数组 [...new Set("aabbcc")] //['a','b','c'] [...new Set("aabbcc")].join('') //'abc' 去重字符串
- Set实例的属性/方法
new Set() | 创建新集合 |
add() | 向集合中添加新元素 |
clear() | 从集合中移除所有元素。 |
delete() | 从集合中移除元素。 |
entries() | 返回包含 [value, value] 对的迭代器(集合中每个元素既是键也是值)。 |
forEach() | 为每个元素调用回调函数。 |
has() | 如果集合中存在某个值,则返回 true。 |
keys() | 与 values() 方法相同。 |
size | 返回集合中元素的数量。 |
values() | 返回包含集合中值的迭代器。 |
-
Array.from()方法 可以将Set 结构转为数组
去重写法 Array.from(new Set(1,1,2,2)) //[1,2]
-
注意点: Set的遍历顺序是插入顺序
-
思考: 使用Set 如何实现数据并集(通过扩展运算符)、交集(通过filter过滤,条件has方法)、差集 (通过filter过滤,条件has方法取反)
2. WeakSet
-
特性:唯一,不重复,成员值只能是“对象”(引用类型),不能是基本数据类型。
-
(弱引用=》垃圾回收机制会自动回收所占内存)
const weakSet1 = new WeakSet(); weakSet1.add([1, 2, 3]); // 匿名数组 console.log(weakSet1); // WeakSet {{...}},但数组可能随时被回收 const weakSet2 = new WeakSet(); const a = [1, 2, 3]; weakSet2.add(a); // 数组被变量 a 引用 console.log(weakSet2); // WeakSet {{...}},数组不会被回收 // 如果变量 a 被销毁或重新赋值 a = null; console.log(weakSet2); // WeakSet 中的数组可能被回收
-
-
WeakSet 实例的属性/方法
add(xx), delete(xx), has(xx), 无size方法,不支持遍历
-
使用场景:适合临时存放一组对象
3. Map
-
特性:键值对(Hash)的数据结构,键可以是任何数据类型 ,唯一值,值可以重复
知识普及:任何具有iterator接口,且每个成员都是一个双元素的数组的数据结构,够可以当做Map构造函数的参数,这就是说,Set和Map都可以用来生成新的Map,就是说把Set对象和Map对象,当做Map构造函数的参数,结果都会生成新的Map对象
-
Map实例的属性/方法
new Map() | 创建新的 Map集合 |
clear() | 移除 Map 中的所有元素。 |
delete() | 通过键移除 Map 中的元素。 |
entries() | 返回包含 Map 中 [键, 值] 对的迭代器对象。 |
forEach() | 为 Map 中的每个键/值对调用回调函数。 |
get() | 获取 Map 中某个键的值 |
set() | Map 中的某个键设置值。 |
groupBy() | 根据回调函数返回的值对对象元素进行分组。 |
has() | 如果 Map 中存在某个键,则返回 true。 |
keys() | 返回包含 Map 中键的迭代器对象 |
size | 返回集合中元素的数量。 |
values() | 返回包含集合中值的迭代器。 |
与其他数据结构的相互转换
Map转为 数组 使用扩展运算法
数组转为 Map 将数组传入Map构造函数
Map转为 对象
所有Map 的键都是字符串,通过新建一个对象,for..of 遍历,添加到对象内
如果有非字符串的键名,需要先转成字符串,再进行上面的操作
对象转为 Map 使用Object.entries()
let obj = {'a':1} let map = new Map(Object.entries(obj))
Map转为 JSON
情况1:键名都是字符串,可优先存为对象JSON,先将Map转为 对象,再通过JSON.stringify()方法
情况2:键名有非字符串,可优先存为数组JSON,先将Map转为 数组(扩展运算符),再通过JSON.stringify()方法
JSON转为 Map
通过JSON.parse()解构,再使用Object.entries()
4. WeakMap
-
特性:(弱引用类型)
-
没有遍历方法(无keys( ),values( ),entries( )),没有size属性
-
无法清空,无clear 方法
-
-
WeakMap实例的属性/方法
-
get( ),set( ),has( ),delete( )
-
-
应用场景:
-
使用DOM节点作为 键名
-
部署私有属性
-