Day6: [资料结构] -  Set

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 数据结构


<<:  [Day4] Vite 出小蜜蜂~ Input Control 操作系统!

>>:  电子书阅读器上的浏览器 [Day06] 增加翻页按钮和分页数字资讯在工具列

Day 27 网路设置与远端

Day 27 网路设置与远端 网路及远端登入可能有先东西在先前已经介绍过,这边再稍微做个简单的范例。...

Day-5 演算法分析工具 : 渐进式符号(Big-O, Big-Theta, Big-Omega)

前言 比较合并排序法与插入排序法,一旦输入n的规模足够大时,合并排序在最坏情况所需的时间Θ,而插入排...

DAY 11- 区块操作模式

"什麽叫你只会加密128位元?" --- 花了不少篇幅介绍两中区块加密方式,DE...

Proxmox VE 网路基本设定

按照前一篇的程序安装完成并重开机後,即可开始正式使用 Proxmox VE 系统,请以浏览器连接至...

Redux流程 + 如何调用 redux 的 state

这篇会介绍的几种调用 redux state 的方式,都是工作上遇到的,算是长了知识,网路上也许会有...