Set 数据结构
基本属性
Set 数据结构类似于数组, 不同于数组的是, Set 数据结构中不允许存在重复的值。1 | let arr = [1,2,2,3,4]; |
set 的类型是一个对象,并且通过使用 set 结构进行处理之后的数据中没有重复数据。使用 set 进行数组去重的方法1 | arr = [...new Set([arr])]// [1,2,3,4] |
Set 实例的属性和方法,
如下图所示
let set = new Set([1,2,3,4])set.prototype.constructor : 默认 set 函数set.size 表示 set 数据结构中成员的个数1 | set.size // 4 |
set 结构的方法,分为操作方法和遍历方法操作方法:add() 用于向 set 数据机构中添加成员delete() 用于删除数据中的某个值,返回布尔值, 表示是否删除成功has() 表示判断数据结构中是否含有某个值,返回的是布尔值,表示是否含有clear() 表示清除所有的成员,没有返回值1 | set// {1,2,3,4} |
1 | function removeDeu (Array) { |
Set 实例的遍历方法
keys() 返回键名的数组values() 遍历键值entires() 遍历键值对儿因为 Set() 结构只有键值,没有键名,因此使用 values() 和 keys() 的遍历结果是一样的1 | let arr = [1,2,3,4]; |
map 等方法1 | let arr = [...set]; |
Map 数据结构
基本属性
对于对象而言,对象是有键值对的数据结构组成的,但是对于对象的键,他的格式会被转换为字符串, 即便我们传入了一个数组或者对象1 | let obj = {}; |
map 结构可以实现对象的键不再必须是字符串的形式创建 map 结构:1 | let map = new Map(); |
map 属性的方法
通过 console 控制台打印数据如下
类似于 Set 结构, 存在 set get delete has clear 等几种操作方法
set(键, 值) 写入数据get(键) 从数据结构中获得对应键的值虽然typeof map// Object 以及map instanceof Object === true但是, Map 是一种不同于对象的数据结构,在对象上使用 [ ] 访问属性的方法在 map 数据结构中是不适用的,要获得Map数据结构中的值, 我们是通过使用get方法,后面我们会说如何将 map 数据结构转换为对象
delete(键) 删除对应键的值clear() 将 map 数据中的所有数据清除has() 返回布尔值, 表示是否含有某条数据使用 map 的数据结构不同于对象的是,通过使用 map 添加的键名可以是变量1 | let map = new Map(); |
1 | let arr = [1]; |
需要注意的一点,通过使用 get() 获取键值的时候,最终是查找到了键值的内存地址
代码如下:1 | map.set({a:1}, 'good'); |
{a:1} 实际上的内存地址是不一样的。使用下面的代码可以找到对应的键值,因为变量 obj 指向了同一个对象的内存地址。1 | let obj = {a: 1}; |
关于对象及内存地址:每创建一个对象,总会创建一个内存地址,对于下面对象:
let person = { name: '张宁宁' } 我们使用 person.name 来访问到值的,但是,对象的值并没有存放在person 容器内,person 中存放了对象的属性,这个属性相当于指针,指向存放 张宁宁 的内存地址例如:{} === {} // false因为这两个空对象的内存地址是不一样的,所以是不相等的使用
map 结构可以传入数组,数组中的成员是存在两个元素的数组结构。其中第一个元素会被当作键名,第二个元素会被当作键值1 | let map = new Map([['name', '张宁宁']]); |
map 对象的遍历方法
对于map 结构的遍历,存在下面几种方法keys() 返回键名的遍历器values() 返回键值的遍历器entires() 返回所有成员的遍历器forEach() 类似于数组中的 forEach() 方法, 实现对于 map 数据结构的遍历使用 keys() values() 以及 entires() 返回的是类数组对象1 | let map = new Map(); |
1 | [...map.keys()] // ['h', 'g'] |
Map 与各种数据结构的相互转化
- 对象转为
map1
2
3
4
5
6
7function toMap (obj) {
let map = new Map();
for (let key in obj) {
map.set(key, obj[key]);
}
return map;
} map转化为对象1
2
3
4
5
6
7function toObj (map) {
let obj = Object.create(null);
for (let [k,v] of map) {
obj[k] = v;
}
return obj;
}