Как я сохраняю Карту ES6 в localstorage (или в другом месте)?

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 между Картой и простым объектом, так, чтобы могло бы быть одно решение, но я надеялся, что должен буду обратиться к внешней зависимости просто для сохранения моей карты.

61
задан 24 June 2019 в 07:34

1 ответ

// 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, таким образом, не будет никакого предположения, что сериализированным объектом должна быть Карта. Это может также быть Карта, глубоко вложенная в массиве или объекте.

0
ответ дан 31 October 2019 в 16:06

Другие вопросы по тегам:

Похожие вопросы: