JS Map和Set常用方法
在 JavaScript 算法中,Map 和 Set 作为高效的哈希表数据结构(平均时间复杂度为 O(1)),常用于处理去重、计数、快速查找等场景。以下是它们在算法中最常用的方法及典型应用:
一、Set(集合:存储唯一值)
Set 用于存储不重复的值,键和值相同,适合处理“存在性判断”“去重”等问题。
1. add(value)
- 作用:向集合中添加一个值(若值已存在则忽略)。
- 算法场景:构建集合(如去重、记录已访问元素)。
javascript
// 示例:数组去重
const arr = [1, 2, 2, 3];
const uniqueSet = new Set();
arr.forEach(num => uniqueSet.add(num)); // 添加元素
const uniqueArr = [...uniqueSet]; // [1, 2, 3]2. has(value)
- 作用:判断集合中是否存在某个值,返回布尔值。
- 算法场景:快速检查元素是否出现过(如两数之和、判断重复元素)。
javascript
// 示例:判断数组中是否有重复元素
function hasDuplicate(arr) {
const set = new Set();
for (const num of arr) {
if (set.has(num)) return true; // 存在重复
set.add(num);
}
return false;
}3. delete(value)
- 作用:删除集合中的某个值,返回是否删除成功(布尔值)。
- 算法场景:动态维护集合(如滑动窗口中移除过期元素)。
javascript
// 示例:滑动窗口去重
const windowSet = new Set();
windowSet.add(1);
windowSet.add(2);
windowSet.delete(1); // 移除窗口中离开的元素4. size
- 作用:获取集合中元素的数量(属性,非方法)。
- 算法场景:统计唯一元素个数、判断窗口大小等。
javascript
// 示例:统计数组中不同元素的数量
const count = new Set(arr).size;5. clear()
- 作用:清空集合中所有元素。
- 算法场景:重置集合(如多轮测试中复用集合)。
6. 遍历相关
forEach((value) => {}):遍历集合中的值。- 扩展运算符
[...set]或Array.from(set):将集合转为数组(便于进一步处理,如排序)。
二、Map(映射:存储键值对)
Map 用于存储键值对(键可以是任意类型,包括对象、函数等),适合处理“键值关联”“计数”等问题。
1. set(key, value)
- 作用:向映射中添加/更新键值对(若键已存在则覆盖值)。
- 算法场景:计数(如统计元素出现次数)、存储索引映射。
javascript
// 示例:统计元素出现次数
const countMap = new Map();
const arr = [1, 2, 2, 3, 3, 3];
arr.forEach(num => {
countMap.set(num, (countMap.get(num) || 0) + 1); // 累加计数
});
// countMap 结果:{1 => 1, 2 => 2, 3 => 3}2. get(key)
- 作用:根据键获取对应的值(若键不存在则返回
undefined)。 - 算法场景:查询键对应的信息(如两数之和中查找目标值的索引)。
javascript
// 示例:两数之和(用Map存储已遍历元素的索引)
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (map.has(complement)) {
return [map.get(complement), i]; // 获取已存储的索引
}
map.set(nums[i], i);
}
}3. has(key)
- 作用:判断映射中是否存在某个键,返回布尔值。
- 算法场景:检查键是否已存在(如避免重复存储)。
4. delete(key)
- 作用:删除映射中某个键值对,返回是否删除成功(布尔值)。
- 算法场景:动态维护键值对(如缓存淘汰、滑动窗口中移除键)。
5. size
- 作用:获取映射中键值对的数量(属性,非方法)。
- 算法场景:统计不同键的数量。
6. 遍历相关
forEach((value, key) => {}):遍历键值对。keys():获取所有键的迭代器。values():获取所有值的迭代器。entries():获取所有键值对([key, value])的迭代器。- 常用于将映射结果转为数组处理:javascript
const entries = [...map.entries()]; // 转为 [[key1, value1], [key2, value2], ...]
总结:核心优势与场景
- Set 核心价值:去重、快速存在性判断(替代数组
includes,效率从 O(n) 提升到 O(1))。 - Map 核心价值:键值关联存储、计数统计(键可以是任意类型,比对象更灵活)。
在算法中,两者均通过哈希表特性优化时间复杂度,是解决数组、字符串类问题的常用工具。