javascript - 你如何 JSON.stringify ES6 Map?

标签 javascript json dictionary ecmascript-6

我想开始使用 ES6 Map而不是 JS 对象,但我被阻止了,因为我不知道如何 JSON.stringify() 一个 Map。我的键保证是字符串,我的值将始终被列出。我真的要写一个包装方法来序列化吗?

最佳答案

JSON.stringifyJSON.parse 都支持第二个参数。 replacerreviver 分别。使用下面的替换器和恢复器,可以添加对原生 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);

关于javascript - 你如何 JSON.stringify ES6 Map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29085197/

相关文章:

javascript - 更改 F5 按钮的行为

javascript - 返回对象列表时在 ajax 中检索数据时出错

c# - 创建可以在 C# 中反序列化的 JSON 对象

c# - 在 C# 中循环遍历 json 数组

javascript - 追加div到表单自动消失

c# - 具有多个参数的 WCF Rest GET

python - 对字典理解的一个小补充

Python:查找字典的key[value]与其他值的差异并返回差异最小的id

python - 获取子列表的第一个元素作为python中的字典键

javascript - 使用 Backbone.js 是否需要使用表单标签?