我想开始使用ES6地图,而不是JS对象,但我踌躇,因为我无法弄清楚如何JSON.stringify()
一个Map
。我的键保证是字符串,我的值将始终被列出。我真的必须编写一个包装方法来序列化吗?
你如何 JSON.stringify 一个 ES6 Map?
IT技术
javascript
json
dictionary
ecmascript-6
2021-01-15 18:27:50
6个回答
双方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);
您不能直接对Map
实例进行字符串化,因为它没有任何属性,但您可以将其转换为元组数组:
jsonText = JSON.stringify(Array.from(map.entries()));
对于相反的情况,请使用
map = new Map(JSON.parse(jsonText));
你不能。
地图的键可以是任何东西,包括对象。但是 JSON 语法只允许字符串作为键。所以在一般情况下是不可能的。
我的键保证是字符串,我的值将始终是列表
在这种情况下,您可以使用普通对象。它将具有以下优点:
- 它将能够被字符串化为 JSON。
- 它适用于较旧的浏览器。
- 它可能会更快。
虽然 ecmascript 还没有提供任何方法,但JSON.stingify
如果您将 映射Map
到 JavaScript 原语,仍然可以使用它来完成。这是Map
我们将使用的示例。
const map = new Map();
map.set('foo', 'bar');
map.set('baz', 'quz');
转到 JavaScript 对象
您可以使用以下辅助函数转换为 JavaScript 对象字面量。
const mapToObj = m => {
return Array.from(m).reduce((obj, [key, value]) => {
obj[key] = value;
return obj;
}, {});
};
JSON.stringify(mapToObj(map)); // '{"foo":"bar","baz":"quz"}'
转到 JavaScript 对象数组
这个辅助函数会更紧凑
const mapToAoO = m => {
return Array.from(m).map( ([k,v]) => {return {[k]:v}} );
};
JSON.stringify(mapToAoO(map)); // '[{"foo":"bar"},{"baz":"quz"}]'
转到数组数组
这更容易,你可以使用
JSON.stringify( Array.from(map) ); // '[["foo","bar"],["baz","quz"]]'
使用spread sytax Map 可以在一行中序列化:
JSON.stringify([...new Map()]);
并将其反序列化:
let map = new Map(JSON.parse(map));
其它你可能感兴趣的问题