集合

集合是一种无重复元素, 无顺序的数据结构。

ES6 引入的 Set 就是集合。

简易版 Set 实现

我们来动手实现一个简易版的 Set, 它拥有的 api 如下:

add(value)
delete(value)
has(value)
clear()
size
// 代码如下, 仅仅用来理解, 实现得不严谨
function Set() {
this.items = {}
this.size = 0
}
Set.prototype.add = function(value) {
if (!this.items[value]) {
this.items[value] = value // 这样子不能实现存储数组、对象
this.size = Object.keys(this.items).length
}
}
Set.prototype.has = function(value) {
if (this.items.hasOwnProperty(value)) {
return true
} else {
return false
}
}
Set.prototype.delete = function(value) {
for (let i in this.items) {
if (this.items.hasOwnProperty(i)) {
if (i === value.toString()) {
delete(this.items[i])
this.size = Object.keys(this.items).length
return true
}
}
}
}
Set.prototype.clear = function() {
this.items = {}
this.size = 0
}

并集、交集、差集、子集

业务中可能用数组多些, 如果碰到 set 类型的可以用 Array.from 将之转为数组类型, 再使用如下方法。

// 并集
function union(arr1, arr2) {
const arr = arr1.concat(arr2)
const result = Array.from(new Set(arr))
return result
}
// 交集
function intersection(arr1, arr2) {
const result = arr1.filter(r => arr2.includes(r)) // 也可以转化为 set,用 has
return result
}
// 差集
function difference(arr1, arr2) {
const result = arr1.filter(r => !arr2.includes(r))
return result
}
// 子集(判断 arr1 是否为 arr2 的子集)
function isSubset(arr1, arr2) {
let bool = true
arr1.forEach(r => {
if (!arr2.includes(r)) {
bool = false
return
}
})
return bool
}

创建 Set 对象

// 方法一
const set1 = new Set()
set.add(1)
// 方法二
const set2 = new Set([1])