Set

135 阅读2分钟

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 遍历方法

  1. keys() 返回键名
  2. 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方法行为一致
  1. entries() 返回键值对
for (let item of set.entries()){
    console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
  1. 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}