在ES6中新增了Set这一数据结构,这在许多编程语言中都能见到。Set很像数组,但是它的元素都是唯一的,也就是说Set内的元素没有两个是一样的。
let s = new Set();
这样就构造了一个Set。
数组用push
或shift
方法分别从数组的前端或后端添加数据,而在Set中,我们可以通过add
方法往Set内添加数据。
let s = new Set();
let arr = [1,2,2,3,4,4];
arr.forEach((item)=>{
s.add(item);
});
for(let i of s){
console.log(i);
}
// 1 2 3 4
从输出结果也可看出Set是不存在两个相同的元素的。值得注意的是,add
方法会返回Set对象。也就是说,add
的方法的使用可以跟Promise
对象的then
方法一样采用链式调用。
let s = new Set();
s.add(1).add(2).add(3).add(4);
在构造Set的时候还可以传入一个数组来初始化。
let s = new Set([1,2,3,4,4]);
console.log(s.size); //4
看到这里,我突然想起在开发中经常会碰到要对数组进行去重的操作。而通过使用扩展操作符和Set就可以比较方便的解决这个问题。
let arr = [1,2,2,2,3,3];
let s = new Set(arr);
arr = [...s];
console.log(arr); //[1,2,3];
在数组中如果我们想判断是否存在某个元素,我们可以使用indexOf
方法,通过返回的索引值来判断。而在Set中,我们可以直接使用has
方法。
let s = new Set();
s.add(1).add(2).add(3);
console.log(s.has(1)); //true
说了那么多数组跟Set的联系,而事实上Set也可以通过Array.from
方法转换成数组。
let s = new Set([1,2,3,4,5,5]);
let arr = Array.from(s);