← All Posts

Map不挺好用的,你还...

闲来无事水一篇。

Map?#

记得那是 es6,它带来了很多,很多改变。其中一个变化就是 Map 数据结构。

它和对象类似也是键值对的集合,但是“键”的范围不局限于字符串,各种类型的值都可以当做键。

概念源自阮一峰 es6

const map = new Map();
// 操作方法
map.set('dog', '一种动物'); // 增
map.get('dog'); // '一种动物' 查
map.has('tian dog'); // false 断言
map.delete('dog'); // true 删除
// 遍历方法
map.keys(); // 返回键名遍历器
map.values(); // 返回键值遍历器
map.entries(); // 返回所有成员的遍历器
map.forEach(); // 遍历所有map成员

以上就是 map 实例的四种方法,那么就有读者问了:就这?我以为多厉害呢,就这?

Map!#

问的好!

这种东西就像是牙签,远看很不起眼,可是你近看,它还是就那样…不过!当你使用它把塞住牙缝中的肉丝儿整条挑出的时候,那种美妙舒爽的感觉会让你沉迷其中。

举个栗子#

现有确定的 5 种类型对应 5 个不同的值,怎么根据类型匹配返回对应的值呢? “if else 不香吗” “还 if else 呢,switch case 知道么” “我不管!我就要硬写!学习?学个屁”

推了下眼镜,我要开始操作了

const typeMap = new Map([
['', '某乐坛代表'],
['', '指太阳'],
['', '不只是植物'],
['', '一种常见的宠物'],
['舔狗', '指本人'],
]);
const typeHandler = (type) => {
return typeMap.get(type);
};
typeHandler(''); //.. 输出 '一种常见的宠物'

天哪,也太好用了 8

“可是,用对象一样可以做啊”

Object || Map#

如一开始所说,Map 对象有内置的迭代器,Object 没有迭代器

console.log(typeof Object[Symbol.iterator]); // undefined
console.log(typeof Map[Symbol.iterator]); // function Map[Symbol.iterator] == Map.entries()

异同#

  • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。
  • Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
  • Object 对象若想遍历,需先获取其键数组,再进行迭代

取舍#

若所有的键都是字符串、整数或 Symbol 类型且都是已知的,你需要一个简单的数据结构去存储,那么使用 Object 是一个不错的选择。毕使用 key 值获取元素比使用构造函数(get())获取元素的性能好。

如果考虑元素迭代或顺序,或是有大量的增删操作,则 Map 性能更优。

if ? switch ?#

Map 数据结构的条件判断写法,优点显而易见的便是条件和结果的对应关系十分明朗,代码易读性极佳,降低了后续增改的维护工作,只需要加入条件和方法即可。

Map 固然十分好用,能够有效的降低团队合作成本,并且看上去优雅。但这也不是完全抛弃传统条件判断的理由。

简单的逻辑使用 if 或 swtich 还是香的,我就是这么干的 👍(露出洁白的牙齿,自信的微笑)

水一水,十年少