今天是国庆假期的最后一天,明天就上班了,不知道大家玩的开心吗
今天我们来学习ES6的新数据类型Set
,简单来说Set
像数组一样存储集合数据,但Set
只会存储唯一不重复的数据。
Set
简介
ES6提供了一种新的数据类型叫Set
,来让我们存储一组具有唯一不重复的数据,创建Set
,我们可以使用new
let setObject = new Set();
Set构造函数接受一个Iterators object(可迭代对象),之后会把这些数据添加到Set中。
let setObject = new Set(iterableObject);
一些有用的 Set
方法
Set给我们提供了一些有用的方法:
add(value)
– 追加一个新的元素到Set中,返回Set
对象,我们可以使用链式调用。clear()
– 清空Set中的所有元素。delete(value)
– 删除Set中的元素。entries()
– 返回一个新的Iterator(可迭代对象)包含[value, value]
。forEach(callback [, thisArg])
– 像数组的forEach一样,并且每次调用会将this
设置为thisArg
has(value)
– 判断Set中是否有该元素,返回true/falsekeys()
– 和values()方法一样。[@@iterator]
– 返回一个新的Iterator object(可迭代对象)。
一些 Set
例子
使用Set给数组去重
下面传入一个数组
let chars = new Set(['a', 'a', 'b', 'c', 'c']);
因为Set会保证数据的唯一性,所以数组中的两个a
和两个c
只会留下一个
console.log(chars);
// 输出:
// Set(3) {'a', 'b', 'c'}
使用typeof查看类型的话,会是object
console.log(typeof(chars));
// 输出:
// object
使用instanceof来判断的话会是true
let result = chars instanceof Set;
console.log(result);
// 输出:
// true
获取Set的长度
使用.size
来获取Set的长度,这和数组length不同
let size = chars.size;
console.log(size);
// 输出:3
向Set中添加元素
使用add()方法向Set中添加数据
chars.add('d');
console.log(chars);
// 输出:
// Set(4) {'a', 'b', 'c', 'd'}
因为add方法会返回当前Set对象,我们也可以使用链式调用
chars.add('e')
.add('f');
判断值是否在Set中
使用has()方法判断一个值是否在Set中,如果存在返回true,反之会是false。
let exist = chars.has('a');
console.log(exist);
// 输出:true
下面会返回false,因为Set中并没有z
exist = chars.has('z');
console.log(exist);
// 输出:false
删除Set中的元素
我们使用delete()方法来去删除Set中的某个元素,比如下面删除Set中的f
,如果删除成功会返回true,反之为false。
chars.delete('f');
// 输出:true
console.log(chars);
// 输出:Set(5) {'a', 'b', 'c', 'd', 'e'}
清空Set中的所有元素,使用clear()方法
chars.clear();
console.log(chars);
// 输出:Set(0) {}
循环Set中的元素
Set对象保持我们插入元素时的顺序,假如我们插入下面的数据
let roles = new Set();
roles.add('1')
.add('3')
.add('2');
下面使用for/of来循环Set
for (let role of roles) {
console.log(role);
}
// 输出:
// 1
// 3
// 2
Set对象同样也提供keys()、values()、entries()方法,下面请看entries()方法,keys和values也差不多一样。
for (let [key, value] of roles.entries()) {
console.log(key, value);
console.log(key === value);
}
// 输出:
// 1 1
// true
// 3 3
// true
// 2 2
// true
使用forEach循环Set
同样也可以使用forEach
roles.forEach(role => console.log(role));
// 输出:
// 1
// 3
// 2
WeakSet
WeakSet
和a Set
很像,只是它只包含对象。由于WeakSet
中的对象可能被自动垃圾回收,所有WeakSet
没有size
属性,也不能迭代它,所以WeakSet
在平时几乎很少使用到。可能只会用WeakSet
来检查某个值是否集合中。
let bmw = {name: 'bmw'};
let benz = {name: 'benz'};
let cars = new WeakSet([bmw, benz]);
if (cars.has(benz)) {
console.log('我们有奔驰品牌的汽车');
}
// 输出:
// 我们有奔驰品牌的汽车
好了,今天的内容到这里了,通过本文相信大家可以知道Set如何去使用。
如果文章有帮助,微信搜索【小帅的编程笔记】,让我们每天进步