ES6 Set

它类似于数组,但是成员的值都是唯一的,没有重复的值。

const s = new Set();
s.add('123');
const set = new Set([1, 2, 3, 4, 4]);
console.log(...set);  //1 2 3 4

向 Set 加入值的时候,不会发生类型转换,所以5"5"是两个不同的值。

Set 内部判断两个值是否不同,类似于精确相等运算符(===),主要的区别是向 Set 加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。

let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
console.log(set); // Set {NaN}

另外,两个对象总是不相等的。

let set = new Set();
let a = {name: '111'};
let b = {name: '111'};
set.add(a);
set.add(b);
console.log(set); // Set [object, object]

 

方法:

has delete

const s = new Set();
s.add('123').add(2);
console.log(s.has('123'));//true
s.delete(2);
console.log(s.has(2)); // false

 

Array.from方法可以将 Set 结构转为数组。这就提供了去除数组重复成员的另一种方法。

const items = new Set([1, 2, 3, 4, 5, 2, 4]);
const array = Array.from(items); //[1, 2, 3, 4, 5]

keys()values()entries()

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

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

foreach()

let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

数组的mapfilter方法也可以间接用于 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, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// 返回Set结构:{2, 4}

如果想在遍历操作中,同步改变原来的 Set 结构,目前没有直接的方法,但有两种变通方法。一种是利用原 Set 结构映射出一个新的结构,然后赋值给原来的 Set 结构;另一种是利用Array.from方法。

// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6

// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6

 

posted @ 2020-09-23 10:40  氧化成风  阅读(97)  评论(0)    收藏  举报