ES6提供了数据结构Set。类似于数组,但是没有重复值。
1.Set本身是一个构造函数,用来生成Set数据结构
let set = new Set();
let arr = [1,2,3,4,5,6,5,4,7,3];
//利用add方法将每个值添加到set中
arr.forEach(current => set.add(current));
console.log(set);//{1, 2, 3, 4, 5, 6, 7}
//循环set,查看每个成员
for(let val of set){console.log(val);}//1 2 3 4 5 6 7
//利用delete删除5,再查看set
console.log(set.delete(5));//true
console.log(set);//{1, 2, 3, 4, 6, 7}
//删除8,由于不存在,所以删除不成功,返回false
console.log(set.delete(8));//false
利用has判断成员是否存在
console.log(set.has(4));//true
console.log(set.has(9));//false
利用clear清除所有成员
set.clear();
console.log(set);//Set(0) {}
set数据结构能够用size属性访问数据结构的成员总数,而且set数据结构可以接受一个数组(或者类数组对象)作为参数,用来初始化。
let set = new Set([1,2,3,4,5,6]);
console.log(set.size);//6
实际应用:利用set数据结构的没有重复值性质,对数组去重。
//数组去重:
let arr = [1,1,1,2,2,3,4,5,6,5,6];
console.log([...new Set(arr)]);//[1, 2, 3, 4, 5, 6]
console.log(Array.from(new Set(arr)));//[1, 2, 3, 4, 5, 6]
//使用 Set 实现并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3, 4]);
let b = new Set([5, 4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
console.log(union);// Set {1, 2, 3, 4, 5}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
console.log(intersect);// set {2, 3, 4}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
console.log(difference);// Set {1}
将set数据结构转化为数组的方法:
Set 加入值的时候,不会发生类型转换,所以5和”5”是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。
let set = new Set();
set.add(5);
set.add("5");
console.log(set);//Set(2) {5, "5"}
set.add(NaN);
set.add(NaN);
console.log(set);//Set(3) {5, "5", NaN}
set.add({});
set.add({});
console.log(set);//Set(5) {5, "5", NaN, {…}, {…}}
let set0 = new Set([1,2,3,4,3,5,4,6,5,7,4]);
//keys()
for(let key of set0.keys()){console.log(key)}//1 2 3 4 5 6 7
//values()
for(let key of set0.values()){console.log(key)}//1 2 3 4 5 6 7
//entries()
for(let key of set0.entries()){console.log(key)}//[1,1] [2,2] [3,3] [4,4] [5,5] [6,6] [7,7]
//forEach()
set0.forEach(val => console.log(val));//1 2 3 4 5 6 7
总结: