Set
介绍
Set
是 ES 6
提供的新的数据结构。类似于数组,但是都是唯一值,没有重复值。
Set
就是一个构造函数,用来生成 Set
数据结构。
add()
就是为 Set
添加成员,我们来试试。
1 2 3 4 5 6 7 8 9 10
| const set = new Set(); set.add(1); set.add(2); set.add(3); set.add(2); set.add(1); for (let s of set) { console.log(s); }
|
代码中可以看出 Set
的数据结构,是不会添加重复的值。
Set
构造函数可以接受一个数组或者具有 iterable 接口的其他数据结构作为参数,用来初始化 Set
。
1 2 3 4 5
| const arr = [1, 2, 2, 2, 3]; const set = new Set(arr);
console.log(set);
|
从这里,我们也可以看出,用于数组去重是一个很好的选择
1 2 3 4
| const arr = [1, 2, 2, 2, 3, 4]; const arr1 = [...new Set(arr)]; console.log(arr1);
|
Set 实例属性和方法
实例属性
Set.prototype.constructor
: 构造函数,默认就是 Set()
。
Set.prototype.size
: 返回 Set
成员总数。
实例方法
Set.prototype.add(value)
: 添加元素到 Set
,返回 Set
本身。
Set.prototype.delete(value)
: 删除某个值,返回一个布尔值。
Set.prototype.has(value)
: 返回一个布尔值,表示该值是否为 Set
的值。
Set.prototype.clear()
: 清除所有值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const set = new Set([1, 2, 3, 4]);
set.add(1); set.add(5); set.add(3);
console.log(set.size); console.log(set.has(5)); console.log(set.has(2));
set.delete(5); set.delete(4);
console.log(set.has(5)); console.log(set.has(4));
|
遍历操作
四个遍历方法。
Set.prototype.keys()
: 返回 key
的遍历器
Set.prototype.values()
: 返回 value
的遍历器
Set.prototype.entries()
: 返回 key: values
的遍历器
Set.prototype.forEach()
: 回调函数遍历,类似数组的 forEach
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const set = new Set(['key1', 'key2', 'key3']); for (let key of set.keys()) { console.log(key); }
for (let val of set.values()) { console.log(val); }
for (let [k, v] of set.entries()) { console.log(k, v); }
set.forEach((val, key) => console.log(key, val));
|
由遍历,我们可以看出,key
与 value
的值是相同的。
Map
介绍
ES 6
提供了 Map
数据结构。类似于对象,也是键值对的集合,但是 key
不限制于字符串,其他类型的值均可以作为 key
。 简单来说 Map
结构提供了 val - val
,而对象必须是 字符串 - val。
map
的简单用法。也看看将对象作为 key
的时候。
1 2 3 4 5 6 7 8 9 10 11
| const map = new Map(); const obj = {}; map.set(obj, 'object'); console.log(map.get(obj)); map.set('string', 'hello hzzzzzzzq'); console.log(map.get('string'));
console.log(map.has(obj)); console.log(map.has('string')); console.log(map.delete('string')); console.log(map.has('string'));
|
上面我们就可以看出,我们将对象 obj
作为一个Map
的键传入,使用 get
获取值,delete
删除,has
作为判断是否有这个值。
我们在来看看,Map
作为构造函数,怎么添加成员。
其实在对象的扩展中,我们已经提到过了。
- 接受数组作为参数,而数组的成员是一个个表示键值对的数组。
1 2 3 4 5 6 7 8 9 10
| const map = new Map([ ['x', 1], ['y', 2], ]); console.log(map.size); console.log(map.has('x')); console.log(map.get('x'));
console.log(map.has('y')); console.log(map.get('y'));
|
- 任何具有
Iterator
接口,且每个成员都是一个双元素的数组的结构都可以当作 Map
的参数。Set
和 Map
自身也可以作为参数。
1 2 3 4 5 6 7 8 9 10
| const set = new Set([['x', 1]]);
const map1 = new Map(set); console.log(map1.get('x'));
const map2 = new Map(); map2.set('y', 2);
const map3 = new Map(map2); console.log(map3.get('y'));
|
- Map 与 Set 类似,如果有重复
key
时,后面的 val
会覆盖前面的 val
,也就是说,map
也是唯一的。
- Map 中若是没有找到这个
key
,则返回 undefined
。
1 2 3 4 5
| const map = new Map(); map.set('x', 1); map.set('x', 2); console.log(map.get('x')); console.log(map.get('y'));
|
Map 属性和操作
1 2 3 4 5
| const map = new Map(); map.set('x', 1); console.log(map.size); map.set('y', 2); console.log(map.size);
|
- Map.prototype.set(key, val)
set(key, val)
方法就是为 Map 添加新的值了。
1 2 3 4 5 6 7 8 9 10 11
| const map = new Map();
map.set('x', 1); map.set(1, 2); map.set(undefined, 3); map.set(null, 4);
console.log(map.get('x')); console.log(map.get(1)); console.log(map.get(undefined)); console.log(map.get(null));
|
- Map.prototype.get(key)
get(key)
方法获取 key
对应的 val
,找不到则返回 undefined。
1 2 3 4 5
| const map = new Map();
map.set('x', 1); console.log(map.get('x')); console.log(map.get('y'));
|
- Map.prototype.has(key);
has(key)
方法判断键名 key
是否在 Map
对象中。
1 2 3 4
| const map = new Map(); map.set('x', 1); console.log(map.has('x')); console.log(map.has('y'));
|
- Map.prototype.delete(key)
delete(key)
方法删除某个键,返回一个布尔值,成功为 true
。
1 2 3 4 5
| const map = new Map(); map.set('x', 1);
console.log(map.delete('x')); console.log(map.delete('y'));
|
- Map.prototype.clear();
clear()
就是清除 Map 对象的所有成员。
1 2 3 4 5 6 7
| const map = new Map(); map.set('x', 1); map.set('y', 2); map.clear();
console.log(map.get('x')); console.log(map.get('y'));
|
遍历
与 Set
类似。
- Map.prototype.keys(): 返回
Map
对象的所有 key
。
- Map.prototype.values():返回
Map
对象的所有 val
。
- Map.prototype.entries():返回
Map
对象的所有成员的遍历器。
- Map.prototype.forEach():遍历
Map
的所有成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const map = new Map(); map.set('x', 1); map.set('y', 2); map.set('z', 3);
for (let key of map.keys()) { console.log(key); }
for (let val of map.values()) { console.log(val); }
for (let [k, v] of map.entries()) { console.log(k, v); }
map.forEach((val, key) => { console.log(key, val); });
|