我想开始使用 ES6 Map而不是 JS 对象,但我被阻止了,因为我不知道如何 JSON.stringify()
一个 Map
。我的键保证是字符串,我的值将始终被列出。我真的要写一个包装方法来序列化吗?
最佳答案
JSON.stringify
和 JSON.parse
都支持第二个参数。 replacer
和 reviver
分别。使用下面的替换器和恢复器,可以添加对原生 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);
结合数组、对象和映射的深度嵌套
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);
关于javascript - 你如何 JSON.stringify ES6 Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29085197/