var a = new Map([[ 'a', 1 ]]); a.get('a') // 1 var forStorageSomewhere = JSON.stringify(a); // Store, in my case, in localStorage. // Later: var a = JSON.parse(forStorageSomewhere); a.get('a') // TypeError: undefined is not a function
Unfortunatly
JSON.stringify(a);
просто возвраты '{}', что означает становление пустым объектом при восстановлении.Я нашел es6-mapify, который позволяет up/down-casting между Картой и простым объектом, так, чтобы могло бы быть одно решение, но я надеялся, что должен буду обратиться к внешней зависимости просто для сохранения моей карты.
// store
const mapObj = new Map([['a', 1]]);
localStorage.a = JSON.stringify(mapObj, replacer);
// retrieve
const newMapObj = JSON.parse(localStorage.a, reviver);
// required replacer and reviver functions
function replacer(key, value) {
const originalObject = this[key];
if(originalObject instanceof Map) {
return {
dataType: 'Map',
value: Array.from(originalObject.entries()), // or with spread: value: [...originalObject]
};
} else {
return value;
}
}
function reviver(key, value) {
if(typeof value === 'object' && value !== null) {
if (value.dataType === 'Map') {
return new Map(value.value);
}
}
return value;
}
я записал здесь объяснение о заменителе и функциях оживителя здесь https://stackoverflow.com/a/56150320/696535
, Этот код будет работать на любое другое значение как регулярный JSON.stringify, таким образом, не будет никакого предположения, что сериализированным объектом должна быть Карта. Это может также быть Карта, глубоко вложенная в массиве или объекте.