首页 前端知识 typescript中map对象序列化为{}问题

typescript中map对象序列化为{}问题

2024-06-05 13:06:55 前端知识 前端哥 238 931 我要收藏

文章目录

  • typescript中map对象序列化为{}问题
    • 问题描述
    • 解决思路
    • 封装序列化工具类解决嵌套对象的情况

typescript中map对象序列化为{}问题

问题描述

ts中在使用JSON进行map对象的序列化时,发现值始终为{},如下代码所示:

let map = new Map<string, string>();
map.set("lzp", "666");
map.set("编程小龙", "666");
console.log("序列化之前");
console.log(map);
console.log("序列化之后");
console.log(JSON.stringify(map));
复制

请添加图片描述

解决思路

可以使用Object.fromEntries将map对象转换成json对象,然后再序列化,接着配合Object.entries将反序列化的结果再转换为map集合

let map = new Map<string, string>();
map.set("lzp", "666");
map.set("编程小龙", "666");
console.log("序列化之前");
console.log(map);
console.log("序列化之后");
let jsonStr = JSON.stringify(Object.fromEntries(map));
console.log(jsonStr);
console.log("反序列化之后");
map = new Map(Object.entries(JSON.parse(jsonStr)));
console.log(map);
复制

请添加图片描述

封装序列化工具类解决嵌套对象的情况

面对更复杂的场景,即可能出现对象的多重嵌套的情况,此时咱们可以先将原对象深度转换成json对象,然后再序列化,如下所示:

封装工具类:

/**
* 处理map类型序列化后为 {} 的情况
*/
export function stringify(obj: any): string {
return JSON.stringify(cloneToObject(obj));
}
// 将字段包含map的对象转为json对象的格式
export function cloneToObject(obj: any): any {
let newObj: any = obj;
if (obj instanceof Map) {
return Object.fromEntries(obj);
}
if (obj instanceof Object) {
newObj = {};
const keys = Object.keys(obj);
const values = Object.values(obj);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const value = values[i];
newObj[key] = cloneToObject(value);
}
}
if (obj instanceof Array) {
newObj = [];
for (let i = 0; i < obj.length; i++) {
newObj[i] = cloneToObject(obj[i]);
}
}
return newObj;
}
复制

测试工具类:

  • 可以看到我们创建了一个复杂的嵌套map对象内容,它仍然能正常的序列化
let lzp = {
name: "lzp",
likes: {
sports: new Map<string, string>([
["k1", "v1"],
["k2", "v2"],
]),
},
game: new Map<string, string>([
["kk1", "vv1"],
["kk2", "vv2"],
]),
};
console.log("自定义工具类进行序列化");
console.log(myUtils.stringify(lzp));
复制

请添加图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/10870.html
标签
ts序列化
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!