map不能直接被json.stringify()序列化,需先转为纯对象或键值对数组;若键全为字符串推荐object.fromentries(map),否则用array.from(map)转二维数组。

Map 不能直接被 JSON.stringify() 序列化,因为它的键可以是任意类型(如函数、对象、Symbol),而 JSON 标准只支持字符串作为键名,且不支持函数、undefined、NaN、Infinity 等值。所以必须先转成 JSON 兼容的结构,再序列化。
Map 转 JSON 字符串的核心步骤
关键在于:**先转为纯对象(Plain Object)或键值对数组,再用 JSON.stringify() 处理**。前提是 Map 的所有键都可安全转为字符串(否则会丢失原始语义)。
- 若 Map 的键全是字符串、数字、布尔值等基础类型 → 推荐转为普通对象
- 若需保留原始键类型信息(如区分
1和"1")→ 改用键值对数组格式(Array) - 若含不可序列化的值(如函数、Date 对象、undefined)→ 需提前过滤或自定义处理逻辑
常用转换方式(ES6+ 原生写法)
① 转为普通对象(适用于键全为字符串/可安全 toString 的场景)
function mapToObject(map) {
const obj = Object.create(null);
for (const [k, v] of map) {
obj[k] = v; // 自动调用 k.toString(),注意非字符串键会被隐式转换
}
return obj;
}
const myMap = new Map([['name', 'Alice'], ['age', 28], ['active', true]]);
const jsonStr = JSON.stringify(mapToObject(myMap));
// → '{"name":"Alice","age":28,"active":true}'
② 转为二维数组(更安全,保留原始键值结构,适合后续反序列化)
const myMap = new Map([[1, 'one'], [true, 'yes'], ['key', 'val']]); const arr = Array.from(myMap); // 或 [...myMap] const jsonStr = JSON.stringify(arr); // → '[[1,"one"],[true,"yes"],["key","val"]]'
这个结果可被 JSON.parse() 还原为数组,再用 new Map(parsedArr) 恢复 Map。
注意事项与常见坑
-
键不是字符串时会“变形”:例如
map.set({}, 'value')→ 转对象后键变成"[object Object]",多个空对象键会互相覆盖 -
undefined、function、Symbol 值无法进入 JSON:
JSON.stringify()会忽略对象中的 undefined / function 属性,Symbol 键会被跳过 -
Map 中的 Date、RegExp、Set、其他 Map 等嵌套结构:需手动递归处理或使用第三方库(如
flatted、serialize-javascript) - 如果项目已用
fastjson(Java)或JSON.stringify()配合自定义 replacer,注意它可能自动调用.toString(),行为不一致
简洁实用的一行写法(日常开发推荐)
当确认键全为字符串时:
const jsonStr = JSON.stringify(Object.fromEntries(myMap));
Object.fromEntries() 是 ES2019 标准方法,专为将可迭代键值对(如 Map)转对象设计,比手写循环更简洁可靠。











