解决方案1
-
replacer 函数:
function replacer(key, value) { if(value instanceof Map) { return { dataType: 'Map', value: Array.from(value.entries()), }; } else { return value; } }
这个函数在遇到 Map 对象时,将其转换为一个包含
dataType
和value
的对象。value
是 Map 转换成的数组。 -
reviver 函数:
function reviver(key, value) { if(typeof value === 'object' && value !== null) { if (value.dataType === 'Map') { return new Map(value.value); } } return value; }
这个函数在解析 JSON 时,检查是否有
dataType
为 ‘Map’ 的对象,如果有,就将其转回 Map 对象。 -
使用方法:
const str = JSON.stringify(originalValue, replacer); const newValue = JSON.parse(str, reviver);
在
stringify
和parse
中使用这两个函数。
优点
- 可以处理深层嵌套的数据结构。
- 保留了 Map 的结构和数据。
- 不需要修改原有的 Map 对象。
注意事项
- 这种方法会增加 JSON 字符串的大小,因为每个 Map 都会被包装在一个额外的对象中。
- 如果您的数据结构中有循环引用,这种方法可能会导致问题。
解决方案2
如果用例比较简单,只需要将 Map 转换为普通对象,可以考虑以下方法:
const mapToObj = map => Object.fromEntries(map);
const objToMap = obj => new Map(Object.entries(obj));
// 使用
const map = new Map([['a', 1], ['b', 2]]);
const obj = mapToObj(map);
const jsonStr = JSON.stringify(obj);
const newObj = JSON.parse(jsonStr);
const newMap = objToMap(newObj);
这种方法更简单,但只适用于键是字符串的情况。