Set 是什么?
- Set是es6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。
- Set本身是一个构造函数,用来生成 Set 数据结构。
- Set函数可以接受一个数组作为参数用来初始化。
new Set()生成出来的数据是Set数据结构,需要自行转换成对应结构,size是set的长度标识。元素唯一使用全等‘===’判断,除了NaN,在set 中,NaN是相等的。
Set 的用法:
1. 数组去重,字符串去重
// 数组去重
let arr = [1, 2, 3, 4, 1, 2, 3];
new Set(arr) // Set(4) {1, 2, 3, 4}// 将结果重新转换为数组
[...new Set(arr)] // [1, 2, 3, 4]// 数组方法也可以用来转换为数组
Array.from(new Set(arr))// 字符串去重
let str = 'abcdab';
new Set(str) // Set(4) {'a', 'b', 'c', 'd'}// 将结果重新转换为字符串
[...new Set(str)].join('') // 'abcd'
只能去重简单数据类型,复杂数据类型不可以。
2. Set 实例的方法,增、删、查、清空
主要分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
- Set.prototype.add(value):添加某个值,返回 Set 结构本身。
- Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
- Set.prototype.clear():清除所有成员,没有返回值。
let s = new Set();
s.add(1).add(2).add(2); // 2被加入了两次,但实际上只会被添加一次s.size // 2 Set(2) {1, 2}// 判断Set是否包含某值
s.has(1) // true
s.has(2) // true
s.has(3) // false// 删除Set中的值
s.delete(2);
s.has(2) // false// 清除所有值
s.clear()
s // Set(0) {size: 0}
3. 遍历方法
1) 遍历Set的keys(), 返回键名的遍历器,相等于返回键值遍历器values()
2) 遍历Set的values(), 返回键值的遍历器
3) 遍历Set的entries(), 返回键值对的遍历器
4) 遍历forEach(), 使用回调函数遍历每个成员
let arr = ['a', 'b', 'c'];let result = new Set(arr);// keys()
for(let i of result.keys()) { console.log(i) // 依次打印 a, b, c
}// values()
for(let i of result.values()) { console.log(i) // 依次打印 a, b, c
}// entries()
for(let i of result.entries()) { console.log(i) // 依次打印 ['a', 'a'] ['b', 'b'] ['c', 'c']
}// forEach()
result.forEach((value, key) => {console.log(`${key}: ${value}`) // 依次打印 a: a b: b c: c
})