Skip to content

JS Map和Set常用方法

在 JavaScript 算法中,MapSet 作为高效的哈希表数据结构(平均时间复杂度为 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 核心价值:键值关联存储计数统计(键可以是任意类型,比对象更灵活)。

在算法中,两者均通过哈希表特性优化时间复杂度,是解决数组、字符串类问题的常用工具。