使い始めたいES6 マップJSON.stringify()
JS オブジェクトの代わりに を使用していますが、の方法がわからないため、使用できませんMap
。キーは文字列であることが保証され、値は常にリストされます。シリアル化するには、本当にラッパー メソッドを記述する必要がありますか?
ベストアンサー1
JSON.stringify
と はそれぞれ2JSON.parse
番目の引数をサポートします。以下の replacer と reviver を使用すると、深くネストされた値を含むネイティブ Map オブジェクトのサポートを追加できます。replacer
reviver
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);