set数据结构被翻译成集合,说明这种数据结构是不会有重复值的,同样JavaScript中的set数据结构类似于数组,但没有重复值。set这种数据结构的声明使用一个构造函数Set(),声明时可以传入一个数组的作为参数用来初始化这个set,可以使用实例方法add()向set中添加元素,可以使用for…of…对这种类数组的set进行遍历
let arr = [1, 2,3,4,4,5,5];
let s = new Set();
arr.forEach(e => s.add(e));
for(let val of s) {
console.log(val);
}
// 1
// 2
// 3
// 4
// 5
将这个数组在set声明的时候作为参数传入可以达到同样的效果
let arr = [1, 2,3,4,4,5,5];
let s = new Set(arr);
for(let val of s) {
console.log(val);
}
可以使用set实例属性size获取这个set的成员的个数
let arr = [1, 2,3,4,4,5,5];
let s = new Set(arr);
a.size;
// 5
显然可以使用set的初始化来做数组去重,通过Array.from()方法将set转化为数组即可。传统方法中一般使用indexOf方法来判断这个值是否与for循环中的i相等,从而选择性剔除来做数组去重
// 传统方法
// 方法一
function unique(arr) {
let arr2 = [];
for(let i = 0, max = arr.length; i < max; i++) {
if(arr2.indexOf(arr[i] == i) {
arr2.push(arr[i]);
}
}
}
// 方法二
function unique(arr) {
let arr2 = [];
for(let i = 0, max = arr.length; i < max; i++) {
if(arr2.indexOf(arr[i]) < 0) {
arr2.push(arr[i]);
}
}
}
// 方法三
function unique(arr) {
return arr.filter(function(ele, index, arr) {
return arr.indexOf(ele) === index;
});
}
// ES2015方法一
function unique(arr) {
return Array.from(new Set(arr));
}
// ES2015方法二,进一步深化ES2015,使用拓展运算符...
function unique(arr) {
return [...new Set(arr)]
}
set实例的属性和方法
1、属性
1、size:返回set的成员个数
let set = new Set();
set.add(1).add(2);
set.size;
// 2
2、方法
1、add():添加一个成员,返回set本身,这就说明这个方法可以使用链式调用。
let set = new Set();
set.add(1).add(2);
2、delete():删除一个成员,返回布尔值,说明是否删除成功,删除失败最常见的就是set中没有这个成员。
let set = new Set();
set.add(1).add(2);
set.delete(1);
// true
set.delete(3);
// false
3、has():判断set中是否存在某个成员,返回布尔值
let set = new Set();
set.add(1).add(2);
set.has(1);
// true
set.has(3);
// false
4、clear():清除set中的所有成员,没有返回值
let set = new Set();
set.add(1).add(2);
set.size;
// 2
set.clear();
set.size;
// 0
5、keys():遍历键值,但是由于set没有键,返回的就是值
let set = new Set();
set.add(1).add(2);
for(let item of set.keys()) {
console.log(item);
}
// 1
// 2
//当然set本身就是一种类数组的数据结构,直接使用for...of...就已经可以遍历
6、values():遍历set中的值,表现和keys()方法一样
7、entries():遍历键值对,同样因为set没有键,返回的键就是和值一样
let set = new Set();
set.add(1).add(2);
for(var item of set.entries()) {
console.log(item);
}
// [1, 1]
// [2, 2]
数组的map方法和filter方法同样适用于set,这两个方法返回新的set
实现set集合的交并补如下:
// 并集
function union(set1, set2) {
return new Set([...set1, ...set2]);
}
// 交集
function intersect(set1, set2) {
return new Set([...set1]).filter(x => set2.has(x));
}
// 补集
function diff(set1, set2) {
return new Set([...set1]).fiter(x => !set2.has(x));
}