ES6--set

set数据结构 类数组 成员值唯一 类型为Object
其本身 是一个构造函数 用来生成Set数据结构

new Set() instanceof Object => true 

Set函数初始化可以接受一个数组(或者具有iterable接口的其他数据结构)作为参数

new Set([1, 2, 3, 4, 4]);
new Set(document.querySelectorAll('div'));

由于set其成员具有唯一性这一特点
则set可以用来数组去重
同样可以用于去除字符串中的重复字符

[...new Set(Array)]
[...new Set('ababbc')].join('')
[...new Set('aaddff')] => ['a','d','f']

Set加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是向 Set加入值时认为NaN等于自身,而精确相等运算符认为NaN不等于自身。在set内部NaN等于自身 ,两个对象总是不相等的,在set内被视为2个值

let set = new Set();
set.add(NaN);
set.add(NaN);
set {NaN}
let set = new Set();
set.add({})
set.add({})
set.size =>2

Set 实例的属性和方法

属性
Set.prototype.constructor:构造函数,默认就是Set函数
Set.prototype.size:返回Set实例的成员总数
let ss = new Set()
ss.add(1).add(3)
ss.size =>2

方法--操作方法

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

let set = new Set()
set.add(1)
set.add(2) 
set.add(3) 
set.add(4)  => [...set] => [1,2,3,4]
set.has(2) => true
set.delete(3) => true =>[...set] => [1,2,4]
set.clear() => [...set] =>[]
Array.from方法可以将 Set 结构转为数组。
const items = new Set([1, 2, 3, 4, 5]);
去重
const array = Array.from(items);
function dedupe(array) {
  return Array.from(new Set(array));
}

dedupe([1, 1, 2, 3]) // [1, 2, 3]
方法--遍历操作

Set.prototype.keys()返回键名
Set.prototype.values()返回键值
Set.prototype.entries()返回键值对
Set.prototype.forEach()使用回调函数遍历每个成员
keys、values、entries方法返回的都是遍历器对象,由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys、values方法的行为完全一致
返回遍历器对象
entries返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。

let set = new Set(['a','b','v']) 
set.keys() => SetIterator {'a', ‘b','c'}  
set.values() => SetIterator {'a', ‘b','c'}
set.entries() = >SetIterator {'a' => 'a', 'c' => 'c'}

Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法
意味着可以省略values方法,直接用for...of循环遍历 Set。

let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
  console.log(x);
}
// red  green  blue

forEach()

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,无返回值。
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
forEach方法的参数就是一个处理函数。该函数的参数与数组的forEach一致,依次为键值、键名、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。

另外,forEach方法还可以有第二个参数,表示绑定处理函数内部的this对象。
遍历的应用
扩展运算符(...)内部使用for...of循环,所以也可以用于 Set 结构。
let set = new Set(['red', 'green', 'blue']);
let arr = [...set] =>['red', 'green', 'blue']

扩展运算符和 Set 结构相结合,就可以去除数组的重复成员。
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)] => [3, 5, 2]
而且,数组的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}
因此使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)
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}
(a 相对于 b 的)差集
let difference = new Set([...a].filter(x => !b.has(x))) => Set {1}

你可能感兴趣的:(ES6--set)