有时候会被问到set和map的区别,下面我总结了一下set和map的特点和区别。以及他们在一些算法题中的妙用。
Map
是一组键值对的结构,具有极快的查找速度。
借用廖雪峰老师的例子,假设要根据同学的名字查找对应的成绩,如果用Array
实现,需要两个Array
:
const names = ['Michael', 'Bob', 'Tracy'];
const scores = [95, 75, 85];
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长。
如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用JavaScript写一个Map如下:
const m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
初始化Map
需要一个二维数组,或者直接初始化一个空Map
。
var m = new Map();
map的其他方法
var m = new Map(); // 初始化一个空Map
m.set('key', value); // 添加新的key-value
m.has('key'); // 是否存在一个指定key
m.get('key'); // 是否存在一个指定key
m.delete('key'); // 删除key
Set
和Map
类似,也是一组key的集合,但不存储value,特点是在Set
中,没有重复的key。
要创建一个Set
,需要提供一个Array
作为输入,或者直接创建一个空Set
:
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复的元素会被过滤掉,重复添加的元素不是不可以添加,而是不起作用:
var s = new Set([1, 2, 3]); // 含1, 2, 3
s.add(3)
s; // Set {1, 2, 3}
s.add(3)
s; // Set {1, 2, 3}
同样是通过delete删除元素:
s.delete(key);
前端的一些算法面试题相对来说算是简单的,因为有跟我一起学习的后端的朋友,我们面试的算法题感觉都不在一个档次,见得最多的数组去重,数组中出现的最多的元素分别对应上了set和map:
数组去重set简单粗暴:
var arr = [1,2,3,3,2,1,5,1];
let a = [...new Set(arr)]
console.log(a)
获取最多元素:
function more(arr){
var max = 0;
var newMap = new Map();
for(var i = 0 ; i < arr.length ; i++){
if(newMap.has(arr[i]*1)){
newMap.set(arr[i],newMap.get(arr[i])*1+1);
}else{
newMap.set(arr[i],1);
}
}
console.log(newMap);
}
元素做key,出现的次数作为value,上边只是把map集合搞出来了,但是怎么拿到那个最大的值,我还要去研究一下,等我研究出来了,我再回来更新博客。