js:从一道算法题比较出object和map的查询速度

1,685 阅读2分钟

之前在leetcode上刷过一道题

当时我想到了两种解法,一种是暴力解法,另一种是对象查找法,暴力解法时间复杂度o(n2),所以我用了第二种对象查找法,第二种方法时间复杂度和空间复杂度都为o(n)

一、暴力解法

二、对象查找法
由于好奇有没有其他性能更好的解法,所以我翻了下评论,看到了这样一个答案
把object换成了map数据结构!由于js对象只能用字符串作为键,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键,map和数组一样都具有Iterator接口,所以它们都能使用for...of来进行遍历。哇,比对象多了这么多使用的功能,那是不是在查询的性能上也更好呢。下面我们来测试一下:

第一个参数传的是1-10000000的数组,第二个参数传的是19999997

测试结果: 解法一:
果不其然,页面卡死了...关也关不掉,只能杀进程了

解法二:

花了七秒钟左右,等待的过程我一度以为又要卡死。。。
不用1s!!!

虽然object和map本质都是hash结构,但是map的底层实际上是由数组封装的,存储数据的就是map的[[Entries]]属性,而[[Entries]]实际上就是个数组,每一项都是存储着key和value的对象,所以map结构在查询的时候需要遍历一遍数组!所以论查询速度还是对象更快。