你如何JSON.stringify一个ES6 Map?

2022-08-30 00:28:34

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


答案 1

两者都支持第二个论点。 和分别。使用下面的替换器和reviver,可以添加对本机Map对象的支持,包括深度嵌套的值JSON.stringifyJSON.parsereplacerreviver

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);

答案 2

您无法直接字符串化实例,因为它没有任何属性,但可以将其转换为元组数组:Map

jsonText = JSON.stringify(Array.from(map.entries()));

相反,使用

map = new Map(JSON.parse(jsonText));