es6 学习笔记 Set 和Map数据结构
Set
定义:类似于数组,但是成员的值都是唯一的,没有重复的值。
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); items // Set(5) {1, 2, 3, 4, 5} [...items] // [1,2,3,4,5]
Set实例的属性
Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。
Set实例的方法
add(value):添加某个值,返回 Set 结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
转换 Set结构转数组
const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);
遍历操作
keys():返回键名的遍历器 (Set结构键名、键值一样)
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
用途:
1.对数组去重;
2.为2个数组,实现并集,交集,差集;
Map
定义:类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。
// 作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。 const map11 = new Map([ ['F', 'no'], ['T', 'yes'], ]); map11 // Map(2) {"F" => "no", "T" => "yes"} let map = new Map(); map.set('foo', true); map.set('bar', false); map // map(2) {"foo" => true, "bar" => false}
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
即:基本数据类型的键同名,为一个键;引用的则不是类型
Map实例的属性
Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Map实例的成员总数。
Map实例的方法
set(key, value): 设置键名key对应的键值为value,然后返回整个 Map 结构
get(key): get方法读取key对应的键值,如果找不到key,返回undefined。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否在Map对象中。
clear():清除所有成员,没有返回值。
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。
forEach():遍历 Map 的所有成员。
转换
Map结构转数组
const map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); [...map.keys()] // [1, 2, 3] [...map.values()] // ['one', 'two', 'three'] [...map.entries()] // [[1,'one'], [2, 'two'], [3, 'three']] [...map] // [[1,'one'], [2, 'two'], [3, 'three']]
Array-->Map:将数组传入 Map 构造函数,就可以转为 Map。
new Map(arry);
Map-->对象:方法:遍历map,对空对象逐一添加
对象-->Map:方法:遍历对象,对空map逐一添加
Map-->JSON 分为转对象JSON 还是数组JSON。方法:先转成对象,在JSON.sringify();
JSON-->Map 方法:JSON-->Object--->Map或 JSON-->Array-->Map
其他
Map和Set 均可以结合数组的map()和filter()方法。