JavaScript的JSON處理Map的弊端詳解
更新時間:2025年05月01日 10:01:57 作者:墮落年代
這篇文章主要介紹了JavaScript的JSON處理Map的弊端,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
JavaScript的JSON處理Map的弊端
- 直接使用
Map
會遇到的問題及解決方案 - 直接使用
Map
會導(dǎo)致數(shù)據(jù)丟失,因為JSON.stringify
無法序列化Map
。
以下是詳細分析及解決方法:
問題復(fù)現(xiàn)
// 示例代碼 const myMap = new Map(); myMap.set('user1', { name: 'Alice' }); myMap.set('user2', { name: 'Bob' }); // 保存 Map utilts.setValuePlan('myMap', myMap); // 實際存儲的是空對象 `{}` // 讀取 Map const loadedMap = utilts.getValuePlan('myMap'); console.log(loadedMap); // 輸出 `{}`,數(shù)據(jù)丟失!
根本原因
JSON.stringify
不支持Map
:Map
對象會被轉(zhuǎn)換為空對象{}
,導(dǎo)致數(shù)據(jù)丟失。JSON.parse
無法還原Map
:即使手動存儲Map
的內(nèi)容,讀取時也無法自動恢復(fù)為Map
。
解決方案(不修改存儲函數(shù))
方法 1:存儲時手動轉(zhuǎn)換 Map
為數(shù)組
在調(diào)用 setValuePlan
前將 Map
轉(zhuǎn)換為數(shù)組,讀取時再轉(zhuǎn)回 Map
。
示例代碼
// 保存 Map const myMap = new Map(); myMap.set('user1', { name: 'Alice' }); myMap.set('user2', { name: 'Bob' }); // 轉(zhuǎn)換為數(shù)組 [[key1, value1], [key2, value2]] const mapArray = Array.from(myMap.entries()); utilts.setValuePlan('myMap', mapArray); // ? 正確存儲 // 讀取時轉(zhuǎn)回 Map const loadedArray = utilts.getValuePlan('myMap') || []; const loadedMap = new Map(loadedArray); // ? 恢復(fù)為 Map
方法 2:封裝工具函數(shù)
創(chuàng)建 Map
專用的存取函數(shù),隱藏轉(zhuǎn)換邏輯。
示例代碼
// 保存 Map export function setMapValue(key, map) { const mapArray = Array.from(map.entries()); utilts.setValuePlan(key, mapArray); } // 讀取 Map export function getMapValue(key) { const mapArray = utilts.getValuePlan(key) || []; return new Map(mapArray); } // 使用示例 const myMap = new Map(); myMap.set('user1', { name: 'Alice' }); setMapValue('myMap', myMap); // ? 存儲 const loadedMap = getMapValue('myMap'); // ? 恢復(fù)
關(guān)鍵總結(jié)
步驟 | 操作 | 代碼示例 |
---|---|---|
存儲 | 轉(zhuǎn)換 Map 為數(shù)組 | utilts.setValuePlan(key, Array.from(map.entries())) |
讀取 | 轉(zhuǎn)換數(shù)組為 Map | new Map(utilts.getValuePlan(key)) |
注意事項
- 數(shù)據(jù)兼容性:確保舊數(shù)據(jù)是數(shù)組格式(如
[[key1, value1], [key2, value2]]
)。 - 空值處理:讀取時處理可能的
null
或無效數(shù)據(jù):
const mapArray = utilts.getValuePlan(key) || [];
- 嵌套對象:如果
Map
的值包含不可序列化對象(如Date
),需額外處理。 - 通過手動轉(zhuǎn)換
Map
和數(shù)組,可以在不修改現(xiàn)有存儲函數(shù)的情況下安全使用Map
!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript function 的 length 屬性使用介紹
函數(shù)的 length 得到的是形參個數(shù),如果函數(shù)內(nèi)部是通過arguments 調(diào)用參數(shù),而沒有實際定義參數(shù)的話, length 只會的得到02014-09-09通過JAVASCRIPT讀取ASP設(shè)定的COOKIE
通過JAVASCRIPT讀取ASP設(shè)定的COOKIE...2006-11-11javascript學(xué)習(xí)小結(jié)之prototype
本系列博文主要談一些在 javascript 使用中經(jīng)常會混淆的高級應(yīng)用,包括: prototype, closure, scope, this關(guān)鍵字. 對于一個需要提高自己javascript水平的程序員,這些都是必須要掌握的,本節(jié)主要介紹prototype.2015-12-12JavaScript中Hoisting詳解 (變量提升與函數(shù)聲明提升)
函數(shù)聲明和變量聲明總是被JavaScript解釋器隱式地提升(hoist)到包含他們的作用域的最頂端。下面這篇文章主要給大家介紹了關(guān)于JavaScript中Hoisting(變量提升與函數(shù)聲明提升)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08