我是Typescript的新手,但对C#有更多的经验。为了学习Typescript语言的一些基础知识,我编写了一个函数,该函数显示对象的属性名称及其值,类似于JSON.stringify方法。
export function writeData<T extends object>(data: T): string {
let result: { key: string, value: any }[] =
Object.entries(data).map(entry => ({ key: entry[0], value: entry[1] }));
result.forEach(entry => {
if (entry.value instanceof Object) {
entry.value = `{ ${writeData(entry.value)} }`;
}
})
return result.map(d => `${d.key}: ${d.value}`).join(", ");
}
所以当我用这个例子
let data = {
id: 1,
name: "outer",
inner: {
id: 1,
name: "inner",
}
}
console.log(writeData(data));
console.log(JSON.stringify(data));
我看到下面的输出很适合我:
id: 1, name: outer, inner: { id: 1, name: inner } - from writeData
{"id":1,"name":"outer","inner":{"id":1,"name":"inner"}} - from JSON.stringify
但是当我在下面的例子中使用这个函数时,我没有在输出中得到Map对象的size属性。我的输出只是一个空对象。我想我应该看到'size'属性-{"size": 1}
。你能解释一下为什么我没有Map对象的size属性与我自己的函数和JSON.stringify?
let data = {
id: 1,
name: "outer",
inner: {
id: 1,
name: "inner",
}
}
// console.log(writeData(data));
// console.log(JSON.stringify(data));
let mapData = new Map<string, any>();
mapData.set("data", data);
console.log(writeData(mapData));
console.log(JSON.stringify(mapData));
1条答案
按热度按时间0ejtzxu11#
Object.entries()
method和theJSON.stringify()
method都只遍历own, enumerable properties对象。obj.prop = val
赋值所设置的大多数普通属性都是可枚举的,但有些属性被显式地标记为不可枚举,以避免在迭代对象时被包括在内。访问器属性(如实现为getter的访问器属性)通常是不可枚举的。size
property of aMap
是Map.prototype
的访问器属性,因此,给定Map
的示例,size
属性既不是own也不是可枚举的。所以它不包括在Object.entries()
或JSON.stringify()
的结果中。