前端笔记之vue中Map、Set之间的使用和区别详析

 更新时间:2025年11月11日 09:31:27   作者:IT技术分享社区  
Vue中的Map格式,是一种用于存储和管理键值对数据的集合,与常规的数组不同,Map提供了更灵活和高效的方式来操作数据,这篇文章主要介绍了前端笔记之vue中Map、Set之间的使用和区别的相关资料,需要的朋友可以参考下

一、基础理论:数据结构的本质差异

1.1 Map:键值对

定义特性:Map是ES6引入的键值对集合,支持任意类型作为键(包括对象、函数等),保持插入顺序,提供O(1)时间复杂度的get/set/delete操作。

核心模型

  • Key-Value模型:存储<K,V>结构,键唯一且不可直接修改

  • 迭代特性:通过entries()返回键值对迭代器,支持forEach遍历

数学表达:Map可视为二元关系R={(k,v)|k∈K,v∈V},满足函数定义f:K→V

1.2 Set:唯一值集合

定义特性:Set是唯一值集合,值自动去重,保持插入顺序,提供O(1)时间复杂度的add/has/delete操作。

核心模型

  • 纯Key模型:存储唯一值,可视为{v|v∈V}集合

  • 等价关系:基于Object.is的等价判断,NaN视为相同值

    拓扑特性:Set空间满足离散拓扑,任意两点不可连通

    二、内部实现:哈希表与红黑树的博弈

    2.1 哈希表实现(HashMap/HashSet)

    底层结构:数组+链表/红黑树,通过哈希函数映射存储位置

    冲突解决

    • 链地址法:哈希冲突时在链表尾部追加节点

    • 红黑树化:链表长度超过8时转换为红黑树

      扩容机制:默认初始容量16,负载因子0.75,扩容时容量翻倍

      2.2 红黑树实现(TreeMap/TreeSet)

      数据结构:自平衡二叉查找树,满足红黑树五条性质

      操作复杂度:插入、删除、查找时间复杂度O(log n)

      排序特性:按键/值的自然顺序或自定义Comparator排序

      三、与数组/对象的对比分析

      数据结构

      键类型

      顺序性

      迭代方式

      典型用例

      Map

      任意类型

      插入顺序

      键值对迭代

      动态属性管理

      Set

      值类型

      插入顺序

      值迭代

      数据去重

      数组

      数字索引

      索引顺序

      索引迭代

      顺序存储

      对象

      字符串/Symbol

      无序

      键迭代

      静态属性存储

      性能对比

      • 查找操作:Map/Set O(1) vs 数组O(n) vs 对象O(1)

      • 内存占用:Map > Set > 数组 > 对象

        四、Vue实战:响应式数据管理

        4.1 响应式Map实现

        import { reactive } from 'vue';
        
        const state = reactive({
          sessions: new Map([
            [1, { active: true }],
            [2, { active: false }]
          ])
        });
        
        // 动态更新触发响应
        state.sessions.set(3, { active: true });

        典型场景

        • 用户会话管理(对象作为键)

        • API响应缓存(避免重复请求)

        • 操作日志记录(保持插入顺序)

          4.2 响应式Set实现

          const selectedItems = reactive(new Set());
          
          // 添加元素自动去重
          selectedItems.add('item1');
          selectedItems.add('item1'); // 不会重复
          
          // 检查存在性
          if (selectedItems.has('item1')) {
            console.log('已选中');
          }

          典型场景

          • 购物车商品去重

          • 权限控制快速检查

          • 表单多选值管理

            五、高级特性:WeakMap与内存管理

            5.1 WeakMap特性

            键弱引用:仅允许对象作为键,不影响垃圾回收

            典型用例

            • 私有属性存储

            • DOM节点关联数据

            • 缓存临时计算结果

            5.2 内存管理策略

            内存释放:

            删除元素不立即释放内存,需容器销毁或shrink_to_fit()

            频繁操作时注意内存碎片问题

            性能优化:

            批量操作使用for...of循环

            避免深度嵌套Map/Set

            预分配初始容量

            六、常见误区与解决方案

            6.1 误区:直接修改Map/Set元素

            错误示范

            const map = reactive(new Map()); map.get('key').name = 'new'; // 不会触发更新

            正确方案

            // 方法1:重新set整个对象
            map.set('key', { ...map.get('key'), name: 'new' });
            
            // 方法2:使用Vue.set
            const obj = map.get('key');
            Vue.set(obj, 'name', 'new');
            map.set('key', obj);

            6.2 误区:Set中存储对象引用

            问题表现

            const set = new Set(); set.add({}); set.add({}); // size=2(不同引用)

            解决方案

            • 使用JSON.stringify转换后存储

            • 改用Map存储对象标识符

              七、性能对比:大数据量下的实证分析

              测试环境:Chrome浏览器,100万条数据

              操作

              Set耗时

              Map耗时

              差异分析

              插入

              20-30ms

              30-40ms

              Map多键值对处理

              查找

              15-25ms

              25-35ms

              Map需额外哈希计算

              内存占用

              80MB

              160MB

              Map存储键值对

              结论

              • 唯一值存储选Set

              • 键值对存储选Map

              • 大数据量注意内存管理

              结语

              Map和Set是Vue开发者处理复杂数据的两把利器。理解它们的数学本质、内部实现和性能特性,结合Vue的响应式系统,能显著提升开发效率和代码质量。

              记住:当需要键值对时选Map,当需要唯一值集合时选Set,这个原则能解决90%的选择难题。

            到此这篇关于前端笔记之vue中Map、Set之间的使用和区别的文章就介绍到这了,更多相关vue中Map、Set使用和区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

            相关文章

            • 使用D3.js+Vue实现一个简单的柱形图

              使用D3.js+Vue实现一个简单的柱形图

              这篇文章主要介绍了使用D3.js+Vue实现一个简单的柱形图,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
              2018-08-08
            • vue接入下载文件接口问题

              vue接入下载文件接口问题

              这篇文章主要介绍了vue接入下载文件接口问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
              2023-09-09
            • VueJs组件之父子通讯的方式

              VueJs组件之父子通讯的方式

              这篇文章主要介绍了VueJs组件之父子通讯的方式,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
              2018-05-05
            • Vue使用Echarts图表多次初始化报错问题的解决方法

              Vue使用Echarts图表多次初始化报错问题的解决方法

              最近在学习Vue的时候,正好学到了引入echarts图表做数据统计的内容,所以下面这篇文章主要给大家介绍了关于Vue使用Echarts图表多次初始化报错问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
              2022-05-05
            • Vue使用三方工具vueUse实现虚拟列表

              Vue使用三方工具vueUse实现虚拟列表

              其实采用vueUse中的useVirtualList方法同样可以实现虚拟列表,这篇文章小编就来和大家详细介绍一下如何使用vueUse实现简单的虚拟列表效果吧
              2024-04-04
            • vue-cli项目中遇到的eslint的坑及解决

              vue-cli项目中遇到的eslint的坑及解决

              这篇文章主要介绍了vue-cli项目中遇到的eslint的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
              2022-04-04
            • Vue中$router.push()路由切换及如何传参和获取参数

              Vue中$router.push()路由切换及如何传参和获取参数

              这篇文章主要给大家介绍了关于Vue中$router.push()路由切换及如何传参和获取参数的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友可以参考下
              2023-03-03
            • element-ui表单提交自动清空隐藏表单值实现

              element-ui表单提交自动清空隐藏表单值实现

              这篇文章主要为大家介绍了element-ui表单提交自动清空隐藏表单值实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
              2022-07-07
            • Vue router重定向redirect如何传值问题

              Vue router重定向redirect如何传值问题

              这篇文章主要介绍了Vue router重定向redirect如何传值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
              2023-10-10
            • vue引入新版 vue-awesome-swiper插件填坑问题

              vue引入新版 vue-awesome-swiper插件填坑问题

              这篇文章主要介绍了vue引入新版 vue-awesome-swiper插件填坑问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
              2018-01-01

            最新评论