Set数据结构

2020年2月27日

Set对象是值的集合,类似数组,但是成员的值是唯一的,即没有重复的值。

let array =  [1, 1, 4, 4, NaN, NaN,'mo', 'mo']
const s = new Set(array);

s // Set(4) {1, 4, NaN, "mo"}

// 添加成员
s.add(0) // Set(5) {1, 4, NaN, "mo", 0}
// 返回对象的值的个数
s.size // 5
s.add({})
s.add({})
s.size // 7 => 对象总是不相等的

常用方法

  • Set.prototype.add(value) 在Set对象尾部添加一个元素。返回该Set对象。
  • Set.prototype.clear() 移除Set对象内的所有元素。
  • Set.prototype.delete(value) 移除Set的中与这个值相等的元素。
  • Set.prototype.has(value) 返回一个布尔值,表示该值在Set中存在与否。
const s = new Set()
s.add(1).add(1).add(2).add(2)

s.size // 2  =>  Set(2) {1, 2}

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2);
s.has(2) // false

s.clear() // => Set(0) {}

遍历操作

Set 结构的实例有四个遍历方法,可以用于遍历成员。

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员
let set = new Set(['red', 'green', 'blue'])

for (let item of set.keys()) {
  console.log(item)
}
// red
// green
// blue

// .values可省
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"]

set.forEach((value, key) => console.log(key + ' : ' + value))

// red : red
// green : green
// blue : blue

常用套路

const s = new Set([1, 'mo'])
let o = {a: 1,b :2}
s.add(o)

// 使用 Array.from 转换Set为Array 
let myArr1 = Array.from(s) // [1, "mo", {"a": 1, "b": 2}]
let myArr2 = [...s] // [1, "mo", {"a": 1, "b": 2}]


let set1 = [1, 2, 3, 4 ,5]
let set2 = new Set([0, 3, 5, 9])

// 并集
let union = new Set([...set1, ...set2])
// Set  {1, 2, 3, 4, 5, 0, 9}

// 交集 
let intersection = new Set([...set1].filter(x => set2.has(x))) //  {3, 5}

// 差集
let difference = new Set([...set1].filter(x => !set2.has(x))) // {1, 2, 4}