Day5: [资料结构] - Map

https://ithelp.ithome.com.tw/upload/images/20210905/20128604A6YTGzNFPq.jpg

Map是JavaScript ES6中新增的资料结构 ,类似於object ,不过Map还是跟object有着以下的差异:

  1. Map的key是可以是原始型别、物件、函式,而object的key限定为string、 symbol
  2. Map为array-like (类阵列)所以可以使用array的方法,像是forEach等等
  3. Map中的keys会根据被添加的时间而有顺序性,而Object则没有顺序性
  4. 假如需要频繁的新增删除属性时,Map的效能会比Object更好

如何宣告一个新的Map

let map = new Map()

//也可以在宣告的时候就赋值,传入[key , value]
let map = new Map([
  ["amber", 18],
  ["shane", 33],
]);

Map.set(key, value) 

新增key-value pairs(键值对),如果key已经存在,旧的值会被新的值覆盖

//第一个值传入key 第二个值传入value
map.set('tom', 28);
map.set('jason', 27);

因为set会回传map的本身,所以可以使用chaining(链)的写法

let map = new Map()
  .set('jay', 13)
  .set('ban', 23)
  .set('luna', 49);

Map.get(key)

用key来获取value,如果没有这个key会回传undefined

map.get('tom'); //get 28

Map.size()

获取Map的长度

map.size // get 2

Map.has(key)

检查Map是否拥有该key,会回传boolean值

map.has('tom') // true or false

Map.delete(key)

删除Map的某个key,如果删除成功会回传true,失败则是false

map.delete('tom') // true or false

Map.clear()

清除Map所有的键值对,不会回传值

map.clear('tom')

Map Iteration (迭代)

  • Map.keys() :回传map所有的key
  • Map.values():回传map所有的value
  • Map.entires():回传map每个元素的[key, value]的键值对
let map = new Map([
  ["amber", 18],
  ["shane", 33],
]);
map.keys() // {'amber', 'shane'}
map.values() // {18, 33}
map.entires() // {"amber" => 18, "shane" => 33}

可以搭配for of或forEach来遍历map

//for of
for(let [key, value] of map){
    console.log('key', key, 'value', value)
}

//forEach 
map.forEach((value, key) => {
   console.log('key', key, 'value', value)
})

将map转成阵列

//....扩展运算子
[...map.keys()] // ["amber", "shane"]

WeakMap

WeakeMap结构类似於Map,只接受object作为key,不接受其它类型的值,不支援迭代的方法ex. keys()、values()、entries()等等,WeakMap的key为弱引用,当作为key的object在其它地方没有被引用的时候,就会被js垃圾回收机制自动回收,整个键值对都会消失。

let weakMap = new WeakMap()
weakMap.set('mark', 19)
//Invalid value used as weak map key 


let obj = {name: 'mark'}
weakMap.set(obj, 5)
//correct

参考资料:MDN


<<:  Day 05 Line Massaging API- 打造自己的 Chatbot

>>:  Day3 - numpy(2) 基本索引

IP资料单元(Datagram)或封包(Packet)?

封装(Encapsulation)和协定的资料单位(PDU) 大家普遍认为(特别是在Cisco/CC...

让Python GUI 画面在最前方显示/ 最小化显示/ 隐藏桌面图示的方法

很多时候,刚程序开启後有可能因为使用者操作的因素就让正在跑的程序被盖住了。尤其是在使用键盘滑鼠精灵控...

如何与使用者对话

How to Talk to Users: Startup Ideas, Building Prod...

【Day 29】Class

在铁人赛中,最後一个要来介绍的章节是 Class!我觉得这是所有章节中最难懂、最抽象的部分,真的是需...

D27 第十四周 (回忆篇)

支线任务:共笔部落格切版 礼拜一的时候终於把留言版做完了,接着是弄共笔部落格的文章列表样板,花了一两...