前言
相信对于前端小伙伴来说,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方法之后,我们再来总结一下它的特点:
- 值的唯一性:Set 中的值是唯一的,不能有重复的值。如果尝试向 Set 中添加相同的值,只能保留一个。
- 无序性:Set 中的值并无特定的顺序,不像数组有索引,因此无法通过索引来获取值。
- 存储任意类型: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 的特点:
- 键的唯一性:Map 中的键也必须是唯一的,不允许重复的键。如果尝试使用相同的键向 Map 中添加值,可以添加成功,但会覆盖原有键对应的值。
- 任意类型的键和值: 与Set 相似, Map 也可以使用任意类型的值作为键和值,包括原始类型、对象引用等。
- 有序性:在插入时,Map 中的键值对是按插入顺序维护的,可以帮我们保留插入时的顺序。