1. ホーム
  2. ジャバスクリプト

[解決済み】ES6 MapをJSON.stringifyする方法とは?

2022-04-07 17:05:37

質問

を使い始めたいと思います。 ES6マップ でも、JSオブジェクトの代わりに JSON.stringify() a Map . 私のキーは文字列であることが保証され、値は常にリストされます。 本当にラッパーメソッドを書いてシリアライズする必要があるのでしょうか?

どのように解決するのですか?

両方 JSON.stringifyJSON.parse は第二引数をサポートしています。 replacerreviver をそれぞれ作成しました。下記の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);