ES6: Set 物件的解題技巧:特性是元素不重複
在這篇文章中,我介紹了 JavaScript 的 Set 物件及其用法。Set 物件能保證元素的唯一性,並提供了添加、刪除和查詢元素的簡便方法。進階部分,我還展示了如何實現集合的聯集、交集和差集,以及如何判斷一個集合是否為另一個集合的超集。
某些情況特別好用,使用時機可見 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]