JavaScript数据结构:字典的实例教程

93 阅读3分钟

什么是地图

一个Map数据结构允许将数据与一个键相关联。

在ES6之前

ECMAScript6(也叫ES2015)将Map数据结构和Set一起引入了JavaScript世界。

在它被引入之前,人们通常使用对象作为地图,通过将一些对象或值与特定的键值联系起来。

const car = {}
car['color'] = 'red'
car.owner = 'Flavio'
console.log(car['color']) //red
console.log(car.color) //red
console.log(car.owner) //Flavio
console.log(car['owner']) //Flavio

输入Map

ES6引入了Map数据结构,为我们提供了一个合适的工具来处理这种数据组织。

一个Map是通过调用来初始化的。

向地图添加项目

你可以通过使用set 方法将项目添加到地图中。

m.set('color', 'red')
m.set('age', 2)

通过键从地图中获取一个项目

而你可以通过使用get 来从地图中获取项目。

const color = m.get('color')
const age = m.get('age')

通过键从地图中删除一个项目

使用delete() 方法。

从地图中删除所有项目

使用clear() 方法。

按键检查一个地图是否包含一个项目

使用has() 方法。

const hasColor = m.has('color')

查找地图中的项目数量

使用size 属性。

用数值初始化一个地图

你可以用一组值来初始化一个地图。

const m = new Map([['color', 'red'], ['owner', 'Flavio'], ['age', 2]])

地图键

就像任何值(对象、数组、字符串、数字)都可以作为地图项的键值项的值一样,任何值都可以作为键,甚至是对象。

如果你试图用get() ,从地图中获取一个不存在的键,它将返回undefined

在现实生活中,你几乎不会发现奇怪的情况

const m = new Map()
m.set(NaN, 'test')
m.get(NaN) //test
const m = new Map()
m.set(+0, 'test')
m.get(-0) //test

遍历一个地图

遍历地图的键

Map提供了keys() 方法,我们可以用它来迭代所有的键。

for (const k of m.keys()) {
  console.log(k)
}

遍历地图值

Map对象提供了values() 方法,我们可以用它来迭代所有的值。

for (const v of m.values()) {
  console.log(v)
}

遍历地图的键、值对

地图对象提供了entries() 方法,我们可以用它来迭代所有的值。

for (const [k, v] of m.entries()) {
  console.log(k, v)
}

这可以简化为

for (const [k, v] of m) {
  console.log(k, v)
}

转换为数组

将地图的键转换成一个数组

将地图的值转换成一个数组

const a = [...m.values()]

弱图(WeakMap

WeakMap是一种特殊的地图。

在一个地图对象中,项目永远不会被垃圾回收。而WeakMap则允许其所有项目自由地被垃圾回收。WeakMap的每个键都是一个对象。当这个对象的引用丢失时,其值可以被垃圾回收。

以下是主要的区别。

  1. 你不能遍历WeakMap的键或值(或键值)。
  2. 你不能清除WeakMap中的所有项目
  3. 不能检查其大小

WeakMap暴露了这些方法,它们等同于Map的方法。

  • get(k)
  • set(k, v)
  • has(k)
  • delete(k)

WeakMap的用例没有Map那么明显,而且你可能永远不会发现对它们的需求,但基本上它可以用来建立一个对内存敏感的、不会干扰垃圾回收的缓存,或者用于仔细的封装和信息隐藏。