如何对ES6 Map对象进行JSON.stringify序列化?

1,531 阅读1分钟

Map在部分场景下比Object要更好用,不过Object原生支持使用JSON.stringify()进行到JSON的序列化和支持使用JSON.parse()进行JSON到Object的解析。

Map可以通过使用JOSN.stringify携带的replacer参数创建自己对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);

// Map、Array、Object的组合嵌套也同样适用
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);

扩展阅读

developer.mozilla.org/zh-CN/docs/…

stackoverflow.com/questions/2…