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}