Set
类似 数组,成员值不重复。
1. 生成Set
1.1 调用构造函数
var s = new Set();
[2,3,4,5,4,2,2].map(x => s.add(x));
for (i of s) {
console.log(i);
}
//2 3 4 5
1.2 接受一个数组(或类数组对象)作为参数
var set = new Set([2,3,4,5,4,2,2]);
2. 5和"5"是不同值
let set = new Set();
set.add(5);
set.size; //1
set.add("5");
set.size; //2
Set内部判断两个值是否相同,使用的是类似于精确等于运算符(===),但是不同的一点是NaN这里判断为同一个值。
2. 属性
- Set.prototype.constructor 构造函数,默认是Set函数
- Set.prototype.size 成员总数
3. 方法
操作方法分为:操作方法 和 遍历方法
3.1 操作方法
var s = new Set();
//add(value) 增加某个值
s.add(1).add(2).add(2);
//delete(value) 删除某个值,返回boolean
s.delete(1);
//has(value) 是否存在某个值,返回boolean
s.has(1); //false
s.has(2); //true
//clear() 清除所有成员,无返回
3.2 遍历方法
- keys() 返回键名
- value() 返回键值
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()){
console.log(item);
}
// red
// green
//blue
for (let item of set.values()){
console.log(item);
}
// red
// green
// blue
//Set结构键名、键值是同一值,所以keys和values方法行为一致
- entries() 返回键值对
for (let item of set.entries()){
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
- forEach() 使用回调遍历每个成员
set.forEach(function(item){
console.log(item);
})
// red
// green
// blue
4. 数组去重
function dedupe(array){
return Array.from(new Set(array));
}
dedupe([1,1,2,3]); //[1,2,3]
Set.prototype[Symbol.iterator] === Set.prototype.values //true
这意味着可以,不适用values直接用for...of循环就可以遍历Set
let set = new Set(['red', 'green', 'blue']);
for(let x of set){
console.log(x)
}
// red
// green
// blue
扩展运算符(...)内部使用for...of循环,下面是一种更加便捷的去重
function dedupe2(array){
return [...new Set(array)]
}
dedupe2([1,1,2,3]); //[1,2,3]
接下来发散一下,map和filter方法也可以间接用于Set了
let set = new Set([1,2,3]);
set = new Set([...set].map(x => x*2));
//返回set结构 {2,4,6}
let set = new Set([1,2,3]);
set = new Set([...set].filter(x => (x%2) == 0));
//返回set结构 {2}