首页 > 语言 > JavaScript > 正文

浅谈es6 javascript的map数据结构

2024-05-06 15:23:35
字体:
来源:转载
供稿:网友

本文介绍了es6 javascript的map数据结构,分享给大家,具体如下:

Map 结构的目的和基本用法

JavaScript 的对象( Object), 本质上是键值对的集合( Hash 结构), 但是传统上只能用字符串当作键。 这给它的使用带来了很大的限制。

var data = {}; var element = document.getElementById('myDiv'); data[element] = 'metadata'; data['[object HTMLDivElement]'] // "metadata" 

上面代码原意是将一个 DOM 节点作为对象data的键, 但是由于对象只接受字符串作为键名, 所以element被自动转为字符串[object HTMLDivElement]。

为了解决这个问题, ES6 提供了 Map 数据结构。 它类似于对象, 也是键值对的集合, 但是“ 键” 的范围不限于字符串, 各种类型的值( 包括对象) 都可以当作键。 也就是说, Object 结构提供了“ 字符串— 值” 的对应, Map 结构提供了“ 值— 值” 的对应, 是一种更完善的 Hash 结构实现。 如果你需要“ 键值对” 的数据结构, Map 比 Object 更合适。

var m = new Map(); var o = {  p: 'Hello World' }; m.set(o, 'content') m.get(o) // "content" m.has(o) // true m.delete(o) // true m.has(o) // false 

上面代码使用set方法, 将对象o当作m的一个键, 然后又使用get方法读取这个键, 接着使用delete方法删除了这个键。
作为构造函数, Map 也可以接受一个数组作为参数。 该数组的成员是一个个表示键值对的数组。

var map = new Map([  ['name', ' 张三 '],  ['title', 'Author'] ]); map.size // 2 map.has('name') // true map.get('name') // " 张三 " map.has('title') // true map.get('title') // "Author" 

上面代码在新建 Map 实例时, 就指定了两个键name和title。

Map 构造函数接受数组作为参数, 实际上执行的是下面的算法。

var items = [  ['name', ' 张三 '],  ['title', 'Author'] ]; var map = new Map(); items.forEach(([key, value]) => map.set(key, value)); 

下面的例子中, 字符串true和布尔值true是两个不同的键。

var m = new Map([  [true, 'foo'],  ['true', 'bar'] ]); m.get(true) // 'foo' m.get('true') // 'bar' 

如果对同一个键多次赋值, 后面的值将覆盖前面的值。

let map = new Map(); map  .set(1, 'aaa')  .set(1, 'bbb'); map.get(1) // "bbb" 

上面代码对键1连续赋值两次, 后一次的值覆盖前一次的值。

如果读取一个未知的键, 则返回undefined。

new Map().get('asfddfsasadf')  // undefined 

注意, 只有对同一个对象的引用, Map 结构才将其视为同一个键。 这一点要非常小心。

var map = new Map(); map.set(['a'], 555); map.get(['a']) // undefined             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选