一文明白ES6新数据类型 Set

今天是国庆假期的最后一天,明天就上班了,不知道大家玩的开心吗

今天我们来学习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/false
  • keys() – 和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如何去使用。

如果文章有帮助,微信搜索【小帅的编程笔记】,让我们每天进步

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值