JavaScript中的Set和Map数据结构有哪些应用场景?

JavaScript中的Set和Map数据结构有哪些应用场景?
最新回答
踮起脚╮亲伱

2021-12-09 07:05:41

JavaScript中的Set和Map数据结构分别适用于去重、存在性检查、集合运算以及复杂键值映射、有序存储等场景,具体应用如下

Set的应用场景
  • 数组去重Set自动过滤重复值,可通过[...new Set(array)]快速实现数组去重。例如:

    const arr = [1, 2, 2, 3];const uniqueArr = [...new Set(arr)]; // 结果为[1, 2, 3]
  • 存在性检查Set的has()方法时间复杂度为O(1),性能优于数组的includes(),适合高频查询场景:

    用户权限验证:存储权限列表,快速判断用户是否拥有某权限。

    关键词过滤:维护黑名单Set,实时检测输入内容是否包含敏感词。

  • 集合运算通过Set操作实现交集、并集、差集:

    const set1 = new Set([1, 2, 3]);const set2 = new Set([2, 3, 4]);// 交集const intersection = new Set([...set1].filter(x => set2.has(x))); // {2, 3}// 差集(set1有而set2无)const difference = new Set([...set1].filter(x => !set2.has(x))); // {1}
Map的应用场景
  • 对象作为键普通对象的键只能是字符串或Symbol,而Map支持任意类型键(如对象、函数):

    const map = new Map();const domNode = document.querySelector('#example');map.set(domNode, { color: 'red' }); // 以DOM节点为键存储样式
  • 频繁增删键值对Map在动态增删时性能优于普通对象,适合状态管理或缓存机制:

    const cache = new Map();cache.set('user1', { data: '...' });cache.delete('user1'); // 高效删除
  • 保持插入顺序Map遍历时按插入顺序返回键值对,适用于需要有序结构的场景:

    操作历史记录:按时间顺序存储用户操作。

    配置项顺序:确保配置项的加载顺序与定义一致。

  • 统计计数使用Map记录频次,避免原型污染风险:

    const wordCount = new Map();const text = 'hello world hello';text.split(' ').forEach(word => { wordCount.set(word, (wordCount.get(word) || 0) + 1);});// 结果:Map { 'hello' => 2, 'world' => 1 }
与普通Object相比的优势
  • Set的优势

    天然支持去重,无需手动实现逻辑。

    has()方法查询效率高于数组的线性搜索。

  • Map的优势

    键类型灵活:支持对象、函数等非字符串键。

    明确的大小属性:通过size直接获取键值对数量,Object需手动计算。

    迭代方便:原生支持forEach和for...of,避免Object.keys()等转换步骤。

    性能优化:频繁增删时,Map的内存管理和哈希表实现更高效。

根据数据结构特性选择Set或Map,可显著提升代码简洁性与执行效率。