当前位置: 首页 > news >正文

JavaScript的JSON处理Map的弊端

直接使用 Map 会遇到的问题及解决方案

直接使用 Map 会导致数据丢失,因为 JSON.stringify 无法序列化 Map。以下是详细分析及解决方法:


  1. 问题复现
// 示例代码
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); // 输出 `{}`,数据丢失!

  1. 根本原因
    JSON.stringify 不支持 MapMap 对象会被转换为空对象 {},导致数据丢失。

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()))
读取转换数组为 Mapnew Map(utilts.getValuePlan(key))

注意事项

  1. 数据兼容性:确保旧数据是数组格式(如 [[key1, value1], [key2, value2]])。
  2. 空值处理:读取时处理可能的 null 或无效数据:
    const mapArray = utilts.getValuePlan(key) || [];
    
  3. 嵌套对象:如果 Map 的值包含不可序列化对象(如 Date),需额外处理。

通过手动转换 Map 和数组,可以在不修改现有存储函数的情况下安全使用 Map

相关文章:

  • Spring Boot 应用优雅关闭
  • FLV 与 MP4 格式深度剖析:结构、原理
  • 【前端】【业务场景】【面试】在网页开发中,如何优化图片以提高页面加载速度?解决不同设备屏幕适配问题
  • 进阶篇 1:超越基准 - 指数平滑 (ETS) 模型详解
  • http通信之axios vs fecth该如何选择?
  • kubernetes》》k8s》》删除命名空间
  • element-ui cascader 组件源码分享
  • Redis—为何持久化使用子进程
  • dify工作流之text-2-e-sql,大模型写sql并执行
  • 《 C++ 点滴漫谈: 三十四 》从重复到泛型,C++ 函数模板的诞生之路
  • 【C++】vector<bool>特化
  • [二叉树]关于前序、中序、后序、层序序列
  • 【机器学习】决策树算法中的 “黄金指标”:基尼系数深度剖析
  • w~视觉~3D~合集2
  • C# foreach 循环中获取索引的完整方案
  • VIN解析API开发指南:从年检报告构建智能定损系统
  • [创业之路-377]:企业法务 - 有限责任公司与股份有限公司的优缺点对比
  • 【KWDB 创作者计划】KWDB 2.2.0深度解析:架构设计、性能优化与企业级实践全指南
  • Python 爬虫如何伪装 Referer?从随机生成到动态匹配
  • Kotlin集合全解析:List和Map高频操作手册
  • 刺激视网膜可让人“看”到全新颜色
  • 董明珠的接班人还是董明珠
  • 习近平向气候和公正转型领导人峰会发表致辞
  • 文旅部:今年一季度国内出游人次17.94亿,同比增长26.4%
  • 浙江严禁中小学节假日集体补课,省市县教育部门公布举报电话
  • 海南公布知识产权保护典型案例,一企业违规申请注册“中华”商标被处罚