解析 Set 与 Map 数据结构

80 阅读3分钟

前言

相信对于前端小伙伴来说,Set和Map数据结构都不会陌生,在我们日常开发中也常用到这两种数据结构。 它们两都是ES6提供的新的数据结构。

Set它类似与数组,它存取的是一组不重复的值。Map它是JS对象,本质上也就键值对的集合,也可以称作为哈希(hash)表。下面我就来详细的介绍一下这两种数据结果。

Set

Set 是一组不重复的值,它也可以存储任何类型的值,原始值和对象引用都可以存进去。但是 Set 中的值一定是唯一的,即每个添加到 Set 中的值只会出现一次。

方法

在介绍完 Set 之后,我们再来看看它自带的 API 方法:

// 创建空的 set 结构 
const set = new Set();
//  创建非空的
const set1 = new Set([1, 2, 3])

// 添加元素方法
set.add(1); // Set(1) { 1 }
set.add(2); // Set(2) { 1, 2 }
set.add(3); // Set(3) { 1, 2, 3 }

// 检查元素是否存在方法
set.has(2); // true
set.has(4); // false

// 获取长度方法
set.size; // 3

// 具有迭代器属性,可以使用for of 循环遍历
for (let value of set) {
 console.log(value)
}
// 1
// 2
// 3

// 删除元素方法
set.delete(2); // true
set.delete(4); // false
set; // Set(2) { 1, 3 }

// 全部清空元素方法
set.clear(); // undefined
set; // Set(0) {}

在看完上述 Set 的API方法之后,我们再来总结一下它的特点:

  1. 值的唯一性:Set 中的值是唯一的,不能有重复的值。如果尝试向 Set 中添加相同的值,只能保留一个。
  2. 无序性:Set 中的值并无特定的顺序,不像数组有索引,因此无法通过索引来获取值。
  3. 存储任意类型:Set 能存储任意类型的值,包括原始类型和对象引用。

Map

Map 它是一组键值对的有序列表,其中键和值都可为任意类型。Map 中的键需要是唯一的,每个键映射关联一个值。而且,Map 中的键和值之间是有序的,这说明我们可以按照它们添加到 Map 中的顺序来迭代它们。

方法

我们再来看看 Map 上自带API方法:

// 创建一个空的 Map
const map = new Map();

// 添加键值对方法
map.set('key1', 'value1');
map.set('key2', 'value2');
map.set('key3', 'value3');

// 查询是否存在方法
map.has('key2'); // true
map.has('key4'); // false

// 获取大小方法
map.size; // 3

// 通过key 获取 value 方法
map.get('key1'); // "value1"
map.get('key4'); // undefined

// Map 也具有迭代器属性,也可以用 for of 遍历
for (let [key, value] of map) {
    console.log(key + ' = ' + value);
}
// key1 = value1
// key2 = value2
// key3 = value3

// 删除键值对方法
map.delete('key2'); // true
map.delete('key4'); // false
map; // Map { 'key1' => 'value1', 'key3' => 'value3' }

// 全部清除元素方法
map.clear(); // undefined
map; // Map {}

我们同样来看看 Map 的特点:

  1. 键的唯一性:Map 中的键也必须是唯一的,不允许重复的键。如果尝试使用相同的键向 Map 中添加值,可以添加成功,但会覆盖原有键对应的值。
  2. 任意类型的键和值: 与Set 相似, Map 也可以使用任意类型的值作为键和值,包括原始类型、对象引用等。
  3. 有序性:在插入时,Map 中的键值对是按插入顺序维护的,可以帮我们保留插入时的顺序。