var map1= new Map();
map1.set("one",1);
var map2 = new Map();
map2.set("two",2);
concatMap = {};
concatMap['one']= map1;
concatMap['two']= map2;
JSON.stringify(concatMap);
Run Code Online (Sandbox Code Playgroud)
//输出:“ {”一个“:{},”两个“:{}}”
我也尝试过:
concatMap = {};
concatMap.one= map1;
concatMap.two= map2;
Run Code Online (Sandbox Code Playgroud)
为什么在使用JSON.stringify()时得到空对象而不是地图1和地图2?
Yac*_*ine 12
基本解决方案:
首先如果你有
const map = new Map();
Run Code Online (Sandbox Code Playgroud)
你可以这样设置值:
map.set('key', 'value');
Run Code Online (Sandbox Code Playgroud)
Object.stringify 将发出并清空对象。
你可以这样解决这个问题:
const objFromMap = Object.fromEntries(map);
JSON.stringify(objFromMap);
Run Code Online (Sandbox Code Playgroud)
复杂对象:
如果您有一个对象的映射字段,例如:
class MyClazz {
field = new Map();
}
const instance = new MyClazz();
instance.field.set('k', 'v');
Run Code Online (Sandbox Code Playgroud)
JSON.stringify 将产生:
{field: {}}
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,请重写 toJSON 方法。你将拥有:
class MyClazz {
field = new Map();
toJSON(): this {
return {
field: Object.fromEntries(this.field),
}
}
}
const instance = new MyClazz();
instance.field.set('k', 'v');
Run Code Online (Sandbox Code Playgroud)
然后,当使用 JSON.stringify(instance); 时 我们会有 :
{field: {k: 'v'}}
Run Code Online (Sandbox Code Playgroud)
这是预期的结果。JSON.stringify不能将Map对象识别为与常规对象不同的任何东西,并且JSON规范本身无法正确存储Map。它只是将地图视为常规对象,可能包括在其上设置的任何自己的对象属性。
var m = new Map();
// This is not included:
m.set('test', 123);
// This would be included:
m['other'] = 456;
console.log(JSON.stringify(m));Run Code Online (Sandbox Code Playgroud)
如果仅使用字符串键,则可以使用常规对象而不是Map。
| 归档时间: |
|
| 查看次数: |
2670 次 |
| 最近记录: |