[英]convert Typescript Map<string, string> to json string representation
我在打字稿中有一个Map<string, string>
变量:
let m = Map<string, string>().set('tag', 'v1');
我想转换为 json 字符串表示:
'{"tag": "v1"}'
我尝试了 3 种不同的方法。 首先是使用m.toString()
。 其次是使用JSON.stringify(m)
。 两者都返回了{}
。 我什至尝试先将Map
转换为 javascript object
,然后再转换为字符串:
function MapToString(map): string {
let ro = {};
Object.keys(map).forEach( key => {
ro[key] = map[key];
});
return JSON.stringify(ro);
}
s = MapToString(m);
当我尝试在控制台中打印它时,这也返回了{}
。
我最终放弃了使用 es6 Map 并切换到TSMap ,其上的tags.toJSON()
工作。
可读? 不,但它有效
JSON.stringify(
Array.from(
new Map().set('tag', 'v1').set('foo', 'bar').entries()
)
.reduce((o, [key, value]) => {
o[key] = value;
return o;
}, {})
)
就像@james-hay 指出的那样,你有一个可能使对象为空的错字
虽然它没有直接回答你的问题:当我遇到同样的问题时,我重新考虑了我对 Map 的使用,并选择了纯 JavaScript 对象。 由于 JSON 总是需要字符串作为键,因此 Map 的主要优势之一(任何类型的键)无论如何都会丢失。
Map 的另一个优点是它们允许良好的类型签名,例如Map<String, Array<String>>
。 但是这里 TypeScript 的“索引签名”为纯 JavaScript 对象提供了这一点,甚至允许为键命名:
interface CityLists {
[postcode: string]: Array<string>
};
这几乎可以像 Map 一样使用(当然,使用不同的语法),即使嵌套. 我认为当您将对象树转换为 JSON 时,后者非常重要,其中映射可以嵌套在其他任意对象和数组的深处。
或者,对于这个用例,TypeScript 也有类型Record<K, T>
:用作类型化映射的普通对象。 在上面的例子中,我可以写:
let cityLists: Record<string, Array<string>>;
cityLists["capitals"] = ["Rome", "Paris", "Berlin"];
在带有 lib es2015 的 Nativescript 中,我可以执行以下操作:
从对象到字符串:
// no need to import JSON
let fooInString = JSON.stringify(this.mapObject.subMap);
从字符串到对象:
// no need to import JSON
let fooInObject = JSON.parse(fooInString);
快乐编码!
虽然这似乎是其他答案中指出的拼写错误,但当 ES6 和 vanilla JS 在同一项目中一起使用时,可能会出现此问题。 JS 不会识别 ES6 映射并将其转换为空对象“{}”。
一个快速的解决方法是在 JS 对象中持久化 ES6 映射时使用序列化器/反序列化器
ES6 转 JS
convertTSMapToJSObj(tsMap) {
const jsObj = {};
tsMap.forEach(function (value, key) {
jsObj[key] = value;
});
return jsObj;
}
JS 转 ES6
convertJSObjToTSMap(jsObj) {
const tsMap = new Map();
const arrayOfMapEntries = new Map<any, any>(Object.entries(jsObj);
for (const [key, value] of arrayOfMapEntries.entries()) {
tsMap.set(key, value);
}
return tsMap;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.