前端面试题:set和map

有时候会被问到set和map的区别,下面我总结了一下set和map的特点和区别。以及他们在一些算法题中的妙用。

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

SetMap类似,也是一组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集合搞出来了,但是怎么拿到那个最大的值,我还要去研究一下,等我研究出来了,我再回来更新博客。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ故里᭄ꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值