Map在部分场景下比Object要更好用,不过Object原生支持使用JSON.stringify()进行到JSON的序列化和支持使用JSON.parse()进行JSON到Object的解析。
Map可以通过使用JOSN.stringify携带的replacer参数创建自己对Map的序列化和解析支持。
实现方式之一
function replacer(key, value) {
if(value instanceof Map) {
return {
dataType: 'Map',
value: Array.from(value.entries()), // or with spread: value: [...value]
};
} else {
return value;
}
}
function reviver(key, value) {
if(typeof value === 'object' && value !== null) {
if (value.dataType === 'Map') {
return new Map(value.value);
}
}
return value;
}
// 用法:
const originalValue = new Map([['a', 1]]);
const str = JSON.stringify(originalValue, replacer);
const newValue = JSON.parse(str, reviver);
console.log(originalValue, newValue);
// Map、Array、Object的组合嵌套也同样适用
const originalValue = [
new Map([['a', {
b: {
c: new Map([['d', 'text']])
}
}]])
];
const str = JSON.stringify(originalValue, replacer);
const newValue = JSON.parse(str, reviver);
console.log(originalValue, newValue);