前端筆記之vue中Map、Set之間的使用和區(qū)別詳析

一、基礎(chǔ)理論:數(shù)據(jù)結(jié)構(gòu)的本質(zhì)差異
1.1 Map:鍵值對

定義特性:Map是ES6引入的鍵值對集合,支持任意類型作為鍵(包括對象、函數(shù)等),保持插入順序,提供O(1)時間復(fù)雜度的get/set/delete操作。
核心模型:
Key-Value模型:存儲
<K,V>結(jié)構(gòu),鍵唯一且不可直接修改迭代特性:通過
entries()返回鍵值對迭代器,支持forEach遍歷
數(shù)學(xué)表達(dá):Map可視為二元關(guān)系R={(k,v)|k∈K,v∈V},滿足函數(shù)定義f:K→V
1.2 Set:唯一值集合

定義特性:Set是唯一值集合,值自動去重,保持插入順序,提供O(1)時間復(fù)雜度的add/has/delete操作。
核心模型:
純Key模型:存儲唯一值,可視為{v|v∈V}集合
等價關(guān)系:基于
Object.is的等價判斷,NaN視為相同值
拓?fù)涮匦?/strong>:Set空間滿足離散拓?fù)?,任意兩點(diǎn)不可連通
二、內(nèi)部實(shí)現(xiàn):哈希表與紅黑樹的博弈
2.1 哈希表實(shí)現(xiàn)(HashMap/HashSet)
底層結(jié)構(gòu):數(shù)組+鏈表/紅黑樹,通過哈希函數(shù)映射存儲位置
沖突解決:
鏈地址法:哈希沖突時在鏈表尾部追加節(jié)點(diǎn)
紅黑樹化:鏈表長度超過8時轉(zhuǎn)換為紅黑樹
擴(kuò)容機(jī)制:默認(rèn)初始容量16,負(fù)載因子0.75,擴(kuò)容時容量翻倍
2.2 紅黑樹實(shí)現(xiàn)(TreeMap/TreeSet)
數(shù)據(jù)結(jié)構(gòu):自平衡二叉查找樹,滿足紅黑樹五條性質(zhì)
操作復(fù)雜度:插入、刪除、查找時間復(fù)雜度O(log n)
排序特性:按鍵/值的自然順序或自定義Comparator排序
三、與數(shù)組/對象的對比分析
數(shù)據(jù)結(jié)構(gòu) | 鍵類型 | 順序性 | 迭代方式 | 典型用例 |
Map | 任意類型 | 插入順序 | 鍵值對迭代 | 動態(tài)屬性管理 |
Set | 值類型 | 插入順序 | 值迭代 | 數(shù)據(jù)去重 |
數(shù)組 | 數(shù)字索引 | 索引順序 | 索引迭代 | 順序存儲 |
對象 | 字符串/Symbol | 無序 | 鍵迭代 | 靜態(tài)屬性存儲 |
性能對比:
查找操作:Map/Set O(1) vs 數(shù)組O(n) vs 對象O(1)
內(nèi)存占用:Map > Set > 數(shù)組 > 對象
四、Vue實(shí)戰(zhàn):響應(yīng)式數(shù)據(jù)管理
4.1 響應(yīng)式Map實(shí)現(xiàn)
import { reactive } from 'vue';
const state = reactive({
sessions: new Map([
[1, { active: true }],
[2, { active: false }]
])
});
// 動態(tài)更新觸發(fā)響應(yīng)
state.sessions.set(3, { active: true });典型場景:
用戶會話管理(對象作為鍵)
API響應(yīng)緩存(避免重復(fù)請求)
操作日志記錄(保持插入順序)
4.2 響應(yīng)式Set實(shí)現(xiàn)
const selectedItems = reactive(new Set());
// 添加元素自動去重
selectedItems.add('item1');
selectedItems.add('item1'); // 不會重復(fù)
// 檢查存在性
if (selectedItems.has('item1')) {
console.log('已選中');
}典型場景:
購物車商品去重
權(quán)限控制快速檢查
表單多選值管理
五、高級特性:WeakMap與內(nèi)存管理
5.1 WeakMap特性
鍵弱引用:僅允許對象作為鍵,不影響垃圾回收
典型用例:
私有屬性存儲
DOM節(jié)點(diǎn)關(guān)聯(lián)數(shù)據(jù)
緩存臨時計算結(jié)果
5.2 內(nèi)存管理策略
內(nèi)存釋放:
刪除元素不立即釋放內(nèi)存,需容器銷毀或
shrink_to_fit()頻繁操作時注意內(nèi)存碎片問題
性能優(yōu)化:
批量操作使用
for...of循環(huán)避免深度嵌套Map/Set
預(yù)分配初始容量
六、常見誤區(qū)與解決方案
6.1 誤區(qū):直接修改Map/Set元素
錯誤示范:
const map = reactive(new Map()); map.get('key').name = 'new'; // 不會觸發(fā)更新正確方案:
// 方法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 誤區(qū):Set中存儲對象引用
問題表現(xiàn):
const set = new Set(); set.add({}); set.add({}); // size=2(不同引用)解決方案:
使用
JSON.stringify轉(zhuǎn)換后存儲改用Map存儲對象標(biāo)識符
七、性能對比:大數(shù)據(jù)量下的實(shí)證分析
測試環(huán)境:Chrome瀏覽器,100萬條數(shù)據(jù)
操作
Set耗時
Map耗時
差異分析
插入
20-30ms
30-40ms
Map多鍵值對處理
查找
15-25ms
25-35ms
Map需額外哈希計算
內(nèi)存占用
80MB
160MB
Map存儲鍵值對
結(jié)論:
唯一值存儲選Set
鍵值對存儲選Map
大數(shù)據(jù)量注意內(nèi)存管理
結(jié)語
Map和Set是Vue開發(fā)者處理復(fù)雜數(shù)據(jù)的兩把利器。理解它們的數(shù)學(xué)本質(zhì)、內(nèi)部實(shí)現(xiàn)和性能特性,結(jié)合Vue的響應(yīng)式系統(tǒng),能顯著提升開發(fā)效率和代碼質(zhì)量。
記?。寒?dāng)需要鍵值對時選Map,當(dāng)需要唯一值集合時選Set,這個原則能解決90%的選擇難題。
到此這篇關(guān)于前端筆記之vue中Map、Set之間的使用和區(qū)別的文章就介紹到這了,更多相關(guān)vue中Map、Set使用和區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用D3.js+Vue實(shí)現(xiàn)一個簡單的柱形圖
這篇文章主要介紹了使用D3.js+Vue實(shí)現(xiàn)一個簡單的柱形圖,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表
其實(shí)采用vueUse中的useVirtualList方法同樣可以實(shí)現(xiàn)虛擬列表,這篇文章小編就來和大家詳細(xì)介紹一下如何使用vueUse實(shí)現(xiàn)簡單的虛擬列表效果吧2024-04-04
vue-cli項(xiàng)目中遇到的eslint的坑及解決
這篇文章主要介紹了vue-cli項(xiàng)目中遇到的eslint的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue中$router.push()路由切換及如何傳參和獲取參數(shù)
這篇文章主要給大家介紹了關(guān)于Vue中$router.push()路由切換及如何傳參和獲取參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-03-03
element-ui表單提交自動清空隱藏表單值實(shí)現(xiàn)
這篇文章主要為大家介紹了element-ui表單提交自動清空隱藏表單值實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
vue引入新版 vue-awesome-swiper插件填坑問題
這篇文章主要介紹了vue引入新版 vue-awesome-swiper插件填坑問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01

