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)遍历的应用
数组的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, 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