ES6新特性(四): Set 和 Map

简介: ES6新特性(四): Set 和 Map

ES6指的是ECMAScript 6,也被称为ES2015。它是JavaScript的一种版本,是ECMAScript标准的第六个版本,于2015年发布。ECMAScript是JavaScript的规范,定义了语言的核心特性和行为。ES6引入了许多新的语法特性和功能,以使JavaScript代码更加现代化、清晰和强大。  在此专栏中,我们会持续更新有关于ES6的新特性,感兴趣的小伙伴们可以订阅一下~

前言

今天我们来聊聊ES6新特性中的Set 和 Map,SetMap 是 ECMAScript 6(ES6)引入的两种新的数据结构,SetMap 提供了更灵活、更强大的数据结构,允许开发者更方便地处理一组唯一的值或键值对。在某些场景下,使用 SetMap 可以带来更高效的数据操作,因为它们是为特定目的而设计的数据结构,而不像普通对象那样有可能包含额外的原型链属性。

Set

Set 是 ECMAScript 6(ES6)中引入的一种数据结构,用于存储一组唯一的值,即不允许重复。它是一种集合类型,与数组类似,但是没有顺序概念。

创建 Set:

可以使用 new Set() 构造函数创建一个空的 Set,或者通过传递一个可迭代对象(如数组)来创建包含初始值的 Set

// 创建空的 Set
const mySet = new Set();
// 创建包含初始值的 Set
const initialSet = new Set([1, 2, 3, 4, 5]);

Set 的基本操作:

  • 添加值: 使用 add 方法向 Set 中添加新的值。
mySet.add(6);
  • 删除值: 使用 delete 方法从 Set 中删除指定的值。
mySet.delete(2);
  • 检查是否存在: 使用 has 方法检查 Set 中是否存在某个值。
console.log(mySet.has(3)); // 输出 true
  • 获取 Set 的大小: 使用 size 属性获取 Set 的大小(包含的唯一值的数量)。
console.log(mySet.size); // 输出当前 Set 的大小

使用 Set 解决数组去重问题:

由于 Set 中的值是唯一的,可以利用这个特性轻松实现数组去重。

const array = [1, 2, 3, 3, 4, 5, 5];
// 使用 Set 进行数组去重
const uniqueValues = [...new Set(array)];
console.log(uniqueValues);
// 输出: [1, 2, 3, 4, 5]

这里的步骤是:

  1. 创建一个 Set 对象,利用 Set 的唯一性会忽略重复值的特性。
  2. 将数组的值通过解构赋值传递给 Set 构造函数,这样 Set 内部会自动去重。
  3. 最后,使用扩展运算符 (...) 将 Set 转回数组。

这样,得到的 uniqueValues 数组就是去重后的结果。

请注意,这种方法去重的结果是保持原数组中的元素顺序的。

set迭代器属性

Set 是可迭代的,这意味着你可以使用一些迭代的方式来遍历 Set 中的元素。以下是 Set 的迭代属性和方法:

1. 使用 for...of 循环:

const mySet = new Set([1, 2, 3, 4, 5]);
for (const value of mySet) {
    console.log(value);
}

这会遍历 Set 中的每一个元素,输出:

1
2
3
4
5

2. 使用 forEach 方法:

const mySet = new Set([1, 2, 3, 4, 5]);
mySet.forEach(value => {
    console.log(value);
});

这也会遍历 Set 中的每一个元素,输出同样的结果。

3. 使用 entries() 方法:

entries() 方法返回一个包含 [value, value] 对的迭代器对象,其中 valueSet 中的元素。

const mySet = new Set([1, 2, 3, 4, 5]);
for (const entry of mySet.entries()) {
    console.log(entry);
}

这将输出:

[1, 1]
[2, 2]
[3, 3]
[4, 4]
[5, 5]

Set 中,键和值相同,所以每个条目都是 [value, value]

4. 使用 values() 方法:

values() 方法返回一个包含 Set 中值的迭代器对象。

const mySet = new Set([1, 2, 3, 4, 5]);
for (const value of mySet.values()) {
    console.log(value);
}

这将输出:

1
2
3
4
5

5. 使用 keys() 方法:

keys() 方法也返回一个包含 Set 中值的迭代器对象,与 values() 方法相同。

const mySet = new Set([1, 2, 3, 4, 5]);
for (const key of mySet.keys()) {
    console.log(key);
}

这同样会输出:

1
2
3
4
5

Set 中,键和值是相同的。

Map

Map 是 ECMAScript 6(ES6)中引入的一种键值对的集合,用于存储任意类型的键和值之间的映射关系。以下是关于 Map 的全面介绍:

创建 Map:

可以使用 new Map() 构造函数创建一个空的 Map,或者通过传递一个包含键值对的数组或其他可迭代对象来创建带有初始值的 Map

// 创建空的 Map
const myMap = new Map();
// 创建包含初始值的 Map
const initialMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2'],
  // ...
]);

Map 的基本操作:

  • 添加键值对: 使用 set 方法向 Map 中添加新的键值对。
myMap.set('key3', 'value3');
  • 获取值: 使用 get 方法获取指定键对应的值。
console.log(myMap.get('key1')); // 输出 'value1'
  • 检查键是否存在: 使用 has 方法检查 Map 中是否存在某个键。
console.log(myMap.has('key2')); // 输出 true
  • 删除键值对: 使用 delete 方法从 Map 中删除指定的键值对。
myMap.delete('key1');
  • 清空 Map: 使用 clear 方法清空 Map 中的所有键值对。
myMap.clear();

Map可以用任意数据类型做 key 的一种对象

Map 允许使用任意类型的值作为键,包括基本数据类型(如字符串、数字、布尔值)、对象、函数等。这是 Map 相对于普通对象的一个重要区别。在普通对象中,键会被自动转换为字符串,而在 Map 中,键的比较是严格相等的,不会发生类型转换。

const myMap = new Map();
// 使用字符串作为键
myMap.set('stringKey', 'This is a string key');
// 使用数字作为键
myMap.set(42, 'This is a number key');
// 使用布尔值作为键
myMap.set(true, 'This is a boolean key');
// 使用对象作为键
const objKey = { key: 'objectKey' };
myMap.set(objKey, 'This is an object key');
// 使用函数作为键
const functionKey = function() {};
myMap.set(functionKey, 'This is a function key');
// 输出 Map 中的键值对
for (const [key, value] of myMap) {
    console.log(key, value);
}

在这个例子中,myMap 包含了不同类型的键,而且每个键都对应一个值。使用 Map 的这种灵活性使得它非常适合在需要根据不同类型的键检索值的场景,而不受键类型转换的影响。

Map 的迭代:

Map 提供了多种迭代的方法,允许遍历键、值或键值对:

  • 遍历键值对:
for (const [key, value] of myMap) {
    console.log(key, value);
}
  • 遍历键:
for (const key of myMap.keys()) {
    console.log(key);
}
  • 遍历值:
for (const value of myMap.values()) {
    console.log(value);
}

总结

Map 的特点:

  1. 键可以是任意类型: 与对象不同,Map 的键可以是任意类型,包括基本数据类型、对象、函数等。
  2. 保持插入顺序: Map 保持插入顺序,即键值对的顺序与插入的顺序一致。
  3. 可迭代: Map 是可迭代的,可以使用 for...of 循环遍历。
  4. 动态变化: Map 的大小可以动态变化,可以随时添加或删除键值对。

使用场景:

  • 存储和获取键值对,适用于需要根据键来检索值的场景。
  • 需要使用非字符串键的情况,例如对象、函数等。
  • 保持键值对的顺序很重要的场景。

Set 的特点:

  1. 唯一性: Set 中的值是唯一的,重复的值会被忽略。
  2. 无序性: Set 中的值是无序的,不具备索引和顺序概念。
  3. 可迭代性: Set 是可迭代的,可以使用 for...of 循环遍历。
  4. 大小可动态变化: 可以随时向 Set 中添加或删除值,其大小会动态变化。

使用场景:

  • 存储一组唯一的值,不关心顺序。
  • 进行数组去重。
  • 判断值是否存在。
相关文章
|
2月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
80 2
|
7月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
87 2
|
3月前
|
编译器 容器
哈希表模拟封装unordered_map和unordered_set
哈希表模拟封装unordered_map和unordered_set
|
3月前
|
编译器 测试技术 计算机视觉
红黑树模拟封装map和set
红黑树模拟封装map和set
|
4月前
|
供应链 JavaScript 前端开发
深入理解 ECMAScript 2024 新特性:Map.groupBy() 分组操作
ECMAScript 2024 (ES15) 引入了 `Map.groupBy()`,极大简化了数据分组操作。该方法从可迭代对象创建一个 `Map`,根据回调函数生成的键进行分组。适用于按条件、属性或复杂键分组,代码更简洁优雅。相比 `reduce`,它提供了更高的性能和更好的可读性,适合处理大量数据。通过详细案例展示,本文深入剖析了 `Map.groupBy()` 的强大功能及其应用场景。
71 11
|
5月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
119 18
你对Collection中Set、List、Map理解?
|
5月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
110 20
|
6月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
142 3
【C++】map、set基本用法
|
6月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
84 5
|
7月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
64 2