闲来无事水一篇。
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还是香的,我就是这么干的👍(露出洁白的牙齿,自信的微笑)
水一水,十年少