ES6: Set 物件的解題技巧:特性是元素不重複

在這篇文章中,我介紹了 JavaScript 的 Set 物件及其用法。Set 物件能保證元素的唯一性,並提供了添加、刪除和查詢元素的簡便方法。進階部分,我還展示了如何實現集合的聯集、交集和差集,以及如何判斷一個集合是否為另一個集合的超集。

ES6: Set 物件的解題技巧:特性是元素不重複
Photo by Adolfo Félix / Unsplash

某些情況特別好用,使用時機可見 LeetCode: Array 類型筆記 (Easy),本文簡單特性與用法,這篇文章會比較短因為希望作為其他文章中可查找的知識節點。

Set 物件有兩個特性
  • Set 中的元素不重複是唯一值
  • Set 資料結構中沒有 key,只有 value,或說在 Set 中 key 等於 value。

1. Set 用法


// 1. 創建 Set
let set1 = new Set([1,2,3,4,5])
let set2 = new Set([1,2,3,3,4,4,5])
console.log(set2) // Set(5) {1, 2, 3, 4, 5}

// 2. 在 Set 尾端加入元素
let mySet = new Set()
mySet.add("1")  // 1
mySet.add("2")  // 1,2
mySet.add("3")  // 1,2,3
mySet.add("2")  // 1,2,3  不會有重複值

// 3. Set 中元素的個數
let mySet = new Set([1,2,3,4,5,5,5,6,7])
mySet.size // 7

// 4. 返回布林值,表示該值是否存在於 Set 中
let mySet = new Set("hello")
mySet.has('h') // true
mySet.has('j') // false

// 5. 移除 Set 中的特定元素
let mySet = new Set([1,1,2,2,3,4,5,6,6])
mySet.delete(3)
mySet.has(3) // false

// 6. 移除 Set 中的所有元素
let mySet = new Set([1,1,2,2,3,4,5,6,6])
mySet.clear()
mySet.size // 0

// 7. 按照元素被加入 Set 的順序,調用 callback function
let mySet = new Set([1,2,3])
mySet.forEach(item => console.log(item))
1
2
3
for (let item of mySet) console.log(item) 
1
2
3

2. Set 進階用法

Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false
        }
    }
    return true
}

Set.prototype.union = function(setB) {
    var union = new Set(this)
    for (var elem of setB) {
        union.add(elem)
    }
    return union
}

Set.prototype.intersection = function(setB) {
    var intersection = new Set()
    for (var elem of setB) {
        if (this.has(elem)) {
            intersection.add(elem)
        }
    }
    return intersection
}

Set.prototype.difference = function(setB) {
    var difference = new Set(this)
    for (var elem of setB) {
        difference.delete(elem)
    }
    return difference
}

// Examples
var setA = new Set([1, 2, 3, 4]),
    setB = new Set([2, 3]),
    setC = new Set([3, 4, 5, 6])

setA.isSuperset(setB) // => true
setA.union(setC) // => Set [1, 2, 3, 4, 5, 6]
setA.intersection(setC) // => Set [3, 4]
setA.difference(setC) // => Set [1, 2]