iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0

https://ithelp.ithome.com.tw/upload/images/20210905/201286042aMC7Vy8X8.jpg
Set是JavaScript ES6中新增的資料結構,Set與陣列很類似,允許任何型態的值,跟陣列不同的是所有的值都是唯一的,不允許有重複的值,因此很適合用來去除重複的值。

宣告一個新Set

let set = new Set()
let set2 = new Set([1, 3, 5, 7]) //{1, 3, 5, 7}
Set.add(value)

新增value

set.add(1) // {1}

這邊要特別注意,因為set不允許有重複的值 ,所以重複add同個元素是不會有效果的

set.add(1) // {1}
set.add(1) // {1} 依然只有一個1

因為add會回傳set的本身,所以可以使用chaining(鏈)的寫法

set.add(1)
   .add(2) 
   .add(3)

Set.has(value)

確認Set是否有該值,回傳boolean值

set.has(1) // return true

Set.delete(value)

刪除該value,如果刪除成功會回傳true,失敗則是false

set.delete(1) // return true

Set.size

回傳set的長度

let set = new Set()
set.add(1)
set.add(2)
set.add(3)
set.size; //3

Set.clear()

清除set所有的內容,不會回傳值

set.clear()

Set Iteration (迭代)

  • Set.keys() :由於set沒有key,所以會回傳所有的value
  • Set.values():回傳set所有的value
  • Set.entires():回傳每個元素[key, value]鍵值對的內容,但因為set沒有key,所以會回傳[value, value]
  • Set.forEach((value, key)=>{}):遍歷set
let set = new Set([1, 3, 5])
set.keys() // {1, 3, 5}
set.values() // {1, 3, 5}
set.entires() // {1 => 1, 3 => 3, 5 => 5}
set.forEach((value, key)=>{console.log('value:', value, 'key:', key)}) 

將Set轉換成?Array

let array = [...set]

將Array轉換成?Set

let set = new Set(array)

所以藉由Set值不重複的特性,如果想去除重複的值可以這麼做

let arr = [1, 2, 2, 3, 1]
let set = new Set(arr) // {1, 2, 2, 3, 1}
let result = [...set] // [1, 2, 3]

或者想找出兩個陣列的聯集

let arr1 = [1, 2, 5, 7, 9]
let arr2 = [1, 3, 4, 7, 8]
let same = new Set([...arr1, ...arr2])
// {1, 2, 5, 7, 9, 3, 4, 8}

WeakSet

WeakSet結構類似於Set,但跟Set不同的是,不接受基本資料型態的值,只接受Object,沒有遍歷和size的方法,只有add、has、delete這三個方法可以使用,另外,WeakSet裡面的物件是Weakly Reference。

甚麼是Weakly Reference?

中文翻作弱引用,不會被垃圾回收機制計入參考,也就是說當其它物件不再參考該物件,就會被js的垃圾回收機制回收掉釋放記憶體,即使物件還在WeakSet裡面,可以必免memery leak(記憶體洩漏)的問題。

let weakSet = new WeakSet()
weakSet.add({})
weakSet.add([])
//{[], {}}
weakSet.add(5)
// TypeError: Invalid value used in weak set

參考資料: Set 和 Map 数据结构


上一篇
Day5: [資料結構] - Map
下一篇
Day7: [資料結構]Stack —堆疊和Queue— 佇列
系列文
每日攝取一點資料結構和演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
WILL.I.AM
iT邦新手 3 級 ‧ 2022-03-25 16:46:41

文章有一個地方寫錯了:

或者想找出兩個陣列的交集(重複的元素)
let arr1 = [1, 2, 5, 7, 9]
let arr2 = [1, 3, 4, 7, 8]
let same = new Set([...arr1, ...arr2])
// {1, 2, 5, 7, 9, 3, 4, 8}

這個結果不是「交集」而是「聯集」

感謝大大刊誤
已修正

我要留言

立即登入留言