JS中Map和Object的对比
在做算法题的过程中,发现当用数字作为一个对象的键来存储数据时,后续取对象中的数据,并不会根据你存入的顺序取出数据。
由此判断出对象中的键其实不是无序的,这个时候可以使用 Map 数据结构来代替。
一、Map 介绍
Map 和 Object 一样用来存取键值对形式的数据。不过 Object 可以使用字面量和构造函数两种方式创建,而 Map 结构必须使用构造函数创建。如下所示:
1 | // 创建一个空的Map对象 |
正如上述第二种方式创建 Map,Map 的键可以为任意数据结构。
二、Map 和 Object 的对比
Map | Object | |
---|---|---|
创建方式 | const myMap = new Map() |
const obj = {} 或 const myObj = new Object() |
键的类型 | 一个 Map 的键可以是任意值,包括函数、对象或任意基本类型。 |
一个Object 的键必须是一个 String 或是Symbol |
键的顺序 | Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。 |
一个 Object 的键是无序的 |
获取一个键(key)的值 | let value = myMap.get(key) |
let value = obj.key 或 let value = obj[key] |
往对象中新增一个键值对 | myMap.set(key, value) |
obj.key = value 或 obj[key] = value |
删除对象中的键值对 | myMap.delete(key) |
delete obj.key 或 delete obj[key] |
对象的 Size | let size = myMap.size |
let size = 0; for (const key in obj) { size++ } |
遍历对象 | 可直接用 forEach、for、forin、forof 进行遍历 | 只能用 forin 进行遍历 |
性能 | 在频繁增删键值对的场景下表现更好。 | 在频繁添加和删除键值对的场景下未作出优化。 |
三、本次使用的场景
在算法题中,我需要用一个对象来存储一个整数数组中元素为键,出现的次数为值。
1 | // 例如: |
这里有另一个需求是,我后续需要根据存进对象的顺序来移除键值对,又因为这里的键是数字,JS 运行环境中,默认又重新根据数字的大小排列了对象,如下图,于是很难根据存入的顺序来进行删除,这时就可以使用 Map 结构
使用 Map 存储该内容后,结果如下:
四、推荐使用 Map 的场景
- 在存取对象时,需要有序的情况下,最好使用 Map
- 在需要频繁增删对象中的键值对时,最好使用 Map
评论