Skip to content
本页目录

Set 数据结构

简述

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。

实例的方法与属性

add(value) 方法

在 Set 对象尾部添加一个元素。返回该 Set 对象。

js
const s = new Set()
s.add(0)
// 可以连写
s.add(1).add(2).add(2).add(3)
console.log(s) // Set(4) { 0, 1, 2, 3 }

clear() 方法

移除 Set 对象内的所有元素。

js
const s = new Set()
s.add(0)
s.add(1).add(2).add(2).add(3)
s.clear()
console.log(s) // Set(0) {}

delete(value) 方法

移除值为 value 的元素,并返回一个布尔值来表示是否移除成功。Set.prototype.has(value) 会在此之后返回 false。

js
const s = new Set()
s.add(0)
s.add(1).add(2).add(2).add(3)
s.delete(2)
// 使用 delete 删除不存在的成员,什么都不会发生,也不会报错
s.delete(4)
console.log(s) // Set(3) { 0, 1, 3 }

entries() 方法

返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值的 [value, value] 数组。为了使这个方法和 Map 对象保持相似,每个值的键和值相等。

js
const set1 = new Set()
set1.add(30)
set1.add('thirty')

const iterator1 = set1.entries()

for (const entry of iterator1) {
  console.log(entry)
  // 输出: Array [30, 30]
  // 输出: Array ["thirty", "thirty"]
}

has(value) 方法

返回一个布尔值,表示该值在 Set 中存在与否。

js
const s = new Set()
s.add(0)
s.add(1).add(2).add(2).add(3)
console.log(s.has(1)) // true
console.log(s.has(4)) // false

values() 方法

返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值。

js
const set1 = new Set()
set1.add(42)
set1.add('forty two')

const iterator1 = set1.values()

console.log(iterator1.next().value) // 42

console.log(iterator1.next().value) // "forty two"

keys() 方法

与 values() 方法相同,返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值。

size 属性

返回 Set 对象中的值的个数

js
const s = new Set()
s.add(0)
s.add(1).add(2).add(2).add(3)

console.log(s.size) // 4

使用 Set 实现的一些方法

转换

js
// Array 转 Set
var mySet = new Set(['value1', 'value2', 'value3']) // {"value1", "value2", "value3"}

// 用...操作符,将 Set 转 Array
var myArray = [...mySet] // ["value1", "value2", "value3"]

// String
// String 转 Set
var mySet = new Set('hello') // Set(4) {"h", "e", "l", "o"}
// 注:Set 中 toString 方法是不能将 Set 转换成 String

去重

js
var mySet = new Set([1, 2, 2, 1, 3, 4, 4])
;[...mySet] // [1, 2, 3, 4]

并集

js
var a = new Set([1, 2, 3])
var b = new Set([4, 3, 2])
var union = new Set([...a, ...b]) // {1, 2, 3, 4}
/* 解构传入,唯一值,相当于去重 */

交集

js
var a = new Set([1, 2, 3])
var b = new Set([4, 3, 2])

var intersect = new Set([...a].filter((x) => b.has(x))) // {2, 3}

使用 has() 方法判断当前 set 对象 中是否含有 x,返回 true/false。 [...a] 解构成数组。filter 过滤

传入 x,返回 set 对象 b 中是否存在 x

存在返回 true,不存在返回 false 被过滤掉

差集

js
var a = new Set([1, 2, 3])
var b = new Set([4, 3, 2])
var difference = new Set([...a].filter((x) => !b.has(x))) // {1}

lemon's personal blog.