JavaScript的JSON处理Map的弊端详解
作者:堕落年代
这篇文章主要介绍了JavaScript的JSON处理Map的弊端,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
JavaScript的JSON处理Map的弊端
- 直接使用
Map会遇到的问题及解决方案 - 直接使用
Map会导致数据丢失,因为JSON.stringify无法序列化Map。
以下是详细分析及解决方法:
问题复现
// 示例代码
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); // 输出 `{}`,数据丢失!根本原因
JSON.stringify不支持Map:Map对象会被转换为空对象{},导致数据丢失。JSON.parse无法还原Map:即使手动存储Map的内容,读取时也无法自动恢复为Map。
解决方案(不修改存储函数)
方法 1:存储时手动转换 Map 为数组
在调用 setValuePlan 前将 Map 转换为数组,读取时再转回 Map。
示例代码
// 保存 Map
const myMap = new Map();
myMap.set('user1', { name: 'Alice' });
myMap.set('user2', { name: 'Bob' });
// 转换为数组 [[key1, value1], [key2, value2]]
const mapArray = Array.from(myMap.entries());
utilts.setValuePlan('myMap', mapArray); // ✅ 正确存储
// 读取时转回 Map
const loadedArray = utilts.getValuePlan('myMap') || [];
const loadedMap = new Map(loadedArray); // ✅ 恢复为 Map方法 2:封装工具函数
创建 Map 专用的存取函数,隐藏转换逻辑。
示例代码
// 保存 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'); // ✅ 恢复关键总结
| 步骤 | 操作 | 代码示例 |
|---|---|---|
| 存储 | 转换 Map 为数组 | utilts.setValuePlan(key, Array.from(map.entries())) |
| 读取 | 转换数组为 Map | new Map(utilts.getValuePlan(key)) |
注意事项
- 数据兼容性:确保旧数据是数组格式(如
[[key1, value1], [key2, value2]])。 - 空值处理:读取时处理可能的
null或无效数据:
const mapArray = utilts.getValuePlan(key) || [];
- 嵌套对象:如果
Map的值包含不可序列化对象(如Date),需额外处理。 - 通过手动转换
Map和数组,可以在不修改现有存储函数的情况下安全使用Map!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
