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
与各种数据结构的相互转化
- 对象转为
map
1
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;
}