ES6中的set和map

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

set

在es6中提供一个叫做set的新数据结构,可以理解为集合,和数组非常类似,但是set的内部成员不允许重复,每一个值在set里都是唯一

它是一个类型,通过这个类型构造的实例可以用来存放不重复的数据,可以通过这个实例的add()方法来往集合中添加数据,这个add()方法会返回集合对象本身,所以可以链式调用,在添加过程中添加了重复的值,那么重复的值就会被忽略

const s=new Set()
s.add(1).add(2).add(3).add(3)
console.log(s); //1,2,3

如果想要遍历集合中的数据,可以使用集合对象的forEach()方法或者使用es6中的for...of循环,所遍历的i是数组中的每一个成员

s.forEach(i => console.log(i)) //1,2,3
for(let i of s){
    console.log(i) //1,2,3
}

还可以通过size属性获取整个集合的长度

console.log(s.size) //3

除了这些,还提供了几个常用的方法:

  • has:判断是否存在某个特定的值
  • delete:判断是否成功删除某个值
  • clear:清除当前集合中全部内容

Set数据结构最常用的应用场景就是去重,定义一个有重复元素的数组,通过new Set()加工这个数组,重复的值就会被忽略掉,如果想得到数组可以使用Array.from()方法将Set数据结构转为数组

const arr=[1,2,1,2,3,4]
const res=Array.from(new Set(arr))
console.log(res);//1,2,3,4

map

es6中还多了一个叫map的数据结构,这种结构本质上都是键值对集合,但是这种对象结构中的键只能是字符串类型,存放一些复杂结构的数据就会有一些问题

用其他类型的数据作为对象的键都会被转为字符串

const obj={}
obj[true] = 'a'
obj[123] = 'b'
obj[{count:1}] = 'c'
console.log(Object.keys(obj));//['123', 'true', '[object Object]']

用map就解决了这个问题,创建一个map实例,使用这个实例的set()方法键就可以使任意的类型了,不会转为字符串,如果要获取其中的数据就可以使用实例的get()方法

const m=new Map()

const obj={name:'abc'}
m.set(obj,90)

console.log(m);
console.log(m.get(obj));

图片.png

除此之外还可以使用实例的其他方法:

  • has:判断某一个键是否存在
  • delete:删除某个键
  • clear:清空所有成员

遍历整个map实例当中值可以使用forEach方法,回调函数中第一个参数是遍历的值,第二个参数是遍历的键

m.forEach((value,key)=>{
    console.log(value,key) //90 {name: 'abc'}
})