ES6中的Map和Set

352 阅读2分钟

简单理解,Set是一种集合,Map是一种字典。

集合存储值是以[值, 值]的形式;

字典存储值是以[键, 值]的形式;

一、Map

看看MDN的定义:

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。


定义一个Map集合:

const map = new Map();
const obj1 = {
    name: 'zhangsan',
    value: '12345'
}
const obj2 = {
    age: 35,
    gender: 'male'
}
map.set(obj1, obj2)
map.get(obj1) // { age: 35, gender: 'male' }

Map和Object的比较

相似点: 都允许按、删除键、检测一个键是否绑定了值。之前都是把对象当Map使用。

不同点: 

1.  Map的键类型可以是任意值,一个Object的键必须是一个String或是Symbol。

2.  键的顺序: Map中的key是有序的,而Object的键是无序的。

注意:自ECMA2015规范后,对象保留了字符串和Symbol的创建顺序,因此在只有字符串键的对象上进行迭代将按插入顺序产生键。

3. Map键值对的个数可通过size获取,而Object只能手动计算。

4. 迭代: Map可以被直接迭代,Object需要某种方式获取键之后才能迭代

5. 性能: Map在频繁增删键值场景下表现更好,而Object并没对此做出优化。

Map的属性和方法

属性

  • size: 返回元素个数

方法: 

  • set(key, value): 添加新元素
  • get(key): 通过键查找特定的数值并返回;
  • has(kekey): 如果键存在,返回true,否则返回false;
  • delete(key): 通过键删除对应数据
  • clear(): 将字典中所有元素删除

遍历:

  • keys(): 以数组形式返回所有键;
  • values(): 以数组形式返回所有值;
  • forEach(): 遍历所有成员

Set

Set集合的特点:

  • 项是无序且唯一的。此特点经常用来做数组去重。
  • Set本身是一个构造函数,用来生成Set数据结构

const set = new Set()
const arr = [1, 2, 3, 4, 4, 5, 3, 4]
arr.forEach(c => s.add(c))

for(let i of set) {
    console.log(i) // 1 2 3 4 5
}

[...new Set(arr)]

Set的属性与方法

属性

  • size: 返回包含元素的数量

方法:

  • add(value): 添加新项
  • delete(value): 删除项
  • has(value): 是否存在 ,返回布尔值
  • clear(): 移除所有项

遍历:

  • keys(): 返回包含所有键的数组
  • values(): 返回一个包含所有值的数组
  • entries(): 返回一个包含所有键值对的数组
  • forEach(): 用于对集合成员进行某种操作,没返回值

用处: 

求交集、并集、差集