Set集合
Set集合:是一种数据结构,结构类似于数组,且没有重复的值。主要用于数组去重,字符串去重。
注意:set是以value:value的格式存放数据。也是以键:值对的方式来存放数据,它比较特殊。它的值就是键,键就是值。
1.操作方法
(1)add()
add():添加值,返回值是Set结构本身。
let set = new Set();
//(1)add():添加值,返回Set结构本身
//1、一个一个添加数据
set.add(1);
set.add(2);
set.add(3);
//2、一起添加数据
set.add(1).add(2).add(2).add(3);
console.log(set); //Set { 1, 2, 3 }
//注意:扩展运算符(...)(解构)可以将Set扩展出来
console.log(...set); //1 2 3
console.log([...set]); //将set转换为数组的方式输出
console.log(set.add(1)); //Set { 1, 2, 3 } 表示返回值是set结构本身
(2)delete()
delate():删除值,并返回一个boolean来表示删除是否成功。
let set = new Set();
set.add(1).add(2).add(3);
console.log(set); //输出结果为Set { 1, 2, 3 }
let flag1 = set.delete(2);
let flag2 = set.delete(5);
console.log(set); //输出结果为Set { 1, 3 }
console.log(flag1); //输出结果为true,表示删除成功
console.log(flag2); //输出结果为false,表示删除失败
(3)has()
has():判断某个值是否在集合中,并返回一个Boolean。
let set = new Set();
set.add(1).add(2);
let a = set.has(1);
let b = set.has(3);
console.log(a); //结果为true,表示set集合中含有1
console.log(b); //结果为false,表示set集合中不含3
(4)clear()
clear():清除所有值,且没有返回值。
let set = new Set();
set.add(1).add(2).add(3);
console.log(set); //输出结果为Set { 1, 2, 3 }
set.clear();
console.log(set); //输出结果为Set{}
2.遍历方法
(1)键、值相同
由于Set只有键值没有键名,也可以说键和值是同一个(键、值相同,可以忽略),所以keys和values返回值相同。
let set = new Set();
set.add(1).add(2).add(3);
for (const key of set.keys()) { //keys()返回集合的所有键(key)
console.log(key);
}
for (const val of set.values()) { //values返回结合中所有的键(ket)对应的值(value)
console.log(val);
}
(2)forEach()
let set = new Set();
set.add("张三").add("李四");
set.forEach(function(key,value){
console.log(`${key}:${value}`);
})
输出结果如下:
(3)Set可以接受一个数组作为参数
let arr = ["张三","李四","王五","赵六"];
console.log(arr);
let set = new Set(arr);
console.log(set);
console.log(...set);
输出结果依次如下:
(4)Set实现并集和交集
let a = [1,2,3];
let b = [2,3,4];
let setA = new Set(a);
let setB = new Set(b);
let bj = new Set([...setA,...setB]); //并集
console.log(bj); //输出结果为Set { 1, 2, 3, 4 }
let jj = new Set([...setA].filter(function(val){ //交集
return setB.has(val);
}))
console.log(jj);
输出结果如下:
WeakSet
WeakSet:只能是对象的集合,而不能是任何其他类型的任意值。WeakSet集合中对象的引用为弱引用。即如果WeakSet中的对象没有被另外引用,那么这些对象会被当作垃圾回收掉。
这也意味着WeakSet中没有存储当前对象的列表。这因为这样,WeakSet中对对象的引用不会被考虑进垃圾回收机制,即只要没有其他的对象引用该对象,该对象就会被回收,而不管它是否在WeakSet中。
let wset = new WeakSet();
let obj = {
name: "小强",
age: 12
}
wset.add(obj);
console.log(wset); //输出结果为:WeakSet { [items unknown] }
(1)WeakSet支持add,has和delete方法,但不支持size和keys(),并且不可迭代。
let wset = new WeakSet();
let jack = {
name: "javk"
}
wset.add(jack,20);
console.log(wset); //输出结果为:WeakSet { [items unknown] }
console.log(wset.has(jack)); //输出结果为:true
wset.delete(jack);
console.log(wset.has(jack)); //输出结果为:false