美文网首页
18- Map 结构

18- Map 结构

作者: 夏海峰 | 来源:发表于2018-08-21 18:04 被阅读8次

1、Map 结构

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。

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

const m = new Map();
const o = { p: 'hello world'};

m.set(o, 'content'); // 键名是一个对象
m.get(o);   // 'content'

m.has(o);   // true
m.delete(o);

作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。

const map = new Map([['name', '张三'], ['title', '律师']]);
map.size;  // 2
map.has('name');   // true
map.get('title');  // '律师'

事实上,不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。这就是说,Set和Map都可以用来生成新的 Map。

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

map.set(1, 'aaa').set(1, 'bbb');
map.get(1);  // 'bbb'

2、Map的实例属性和操作方法

size
set()
get()
has()
delete()
clear()

3、Map的遍历方法

keys()    返回键名的遍历器。
values()  返回键值的遍历器。
entries() 返回所有成员的遍历器。
forEach() 遍历 Map 的所有成员。

Map 的遍历顺序就是插入顺序。

const map = new Map([['a', 'aaa'], ['b', 'bbb']]);
for(let [key,value] of map.entries()) {
    console.log(key, value);
}
// 'a' 'aaa'
// 'b' 'bbb'

Map 结构转为数组结构,比较快速的方法是使用扩展运算符(...)。

[...map];
[...map.keys()];
[...map.values()];
[...map.entries()];

Map 还有一个forEach方法,与数组的forEach方法类似,也可以实现遍历。forEach方法还可以接受第二个参数,用来绑定this。

4、Map结构与其它结构进行相互转换

Map 转成 数组
数组 转成 Map
Map 转成 对象
对象 转成 Map
Map 转成 JSON
JSON 转成 Map

5、WeakMap

WeakMap结构与Map结构类似,也是用于生成键值对的集合。
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
WeakMap的键名所指向的对象,不计入垃圾回收机制。

WeakMap 没有遍历操作(即没有key()、values()和entries()方法),也没有size属性。

const k1 = [1, 2, 3];
const k2 = [4, 5, 6];
const wm = new WeakMap([[k1, 'foo'], [k2, 'bar']]);
wm.get(k2) // "bar"

完!!!

相关文章

网友评论

      本文标题:18- Map 结构

      本文链接:https://www.haomeiwen.com/subject/bqgjiftx.html