es6中的Set

Set:

他是一个它类似于数组的数据结构

1.Set 结构不会添加重复的值。(可以解决数组去重,哈哈)

const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]

 注:(...属于解构赋值,复制一份后面所带的数组或者对象,复制一份新的连同地址)

附上数组去重的方法:

let arr = [1, 2, 2, 3]; 
 
let set = new Set(arr); //set是es6提出的类数组结构,不可添加重复元素
 
let newArr = Array.from(set); // Array.from方法可以将 Set 结构转为数组。 
 
console.log(newArr); // [1, 2, 3]

注:(Array.from()在这里是将Set变成数组,Set属于类数组结构,所以将它变成数组

向 Set 加入值的时候,不会发生类型转换,所以5"5"是两个不同的值。它类似于精确相等运算符(===),而精确相等运算符认为NaN不等于自身。但是在Set内部NaN等鱼NaN,另外,两个对象总是不相等的。

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。

四个操作方法。

  • add(value):添加某个值,返回 Set 结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。

Set.size:返回Set实例的成员总数。

四个遍历方法,

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

由于 Set 结构键名和键值是同一个值(key就是value),所以keys方法和values方法的行为完全一致。

例:

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"]

也可以直接用for...of循环遍历 Set。

let set = new Set(['red', 'green', 'blue']);

for (let x of set) {
  console.log(x);
}
// red
// green
// blue

(2)forEach()

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。

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

forEach方法的参数依次为键值、键名、集合本身 ,Set 结构的键名就是键值,因此第一个参数与第二个参数的值永远都是一样的。另外,forEach方法还可以有第二个参数,表示绑定处理函数内部的this对象。

(3)遍历的应用

数组的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}


let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));

 如果想在遍历操作中,同步改变原来的 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

猜你喜欢

转载自blog.csdn.net/qq_37918196/article/details/83350135
今日推荐