typescript 无法使用Object.entries方法查看Map对象的属性

e5njpo68  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(152)

我是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));
0ejtzxu1

0ejtzxu11#

Object.entries() methodthe JSON.stringify() method都只遍历own, enumerable properties对象。

  • Own* 属性必须直接存在于对象上,并且不能从其prototype链继承。
  • Enumerable* 属性是那些带有可枚举标志的属性(参见What does enumerable mean?); obj.prop = val赋值所设置的大多数普通属性都是可枚举的,但有些属性被显式地标记为不可枚举,以避免在迭代对象时被包括在内。访问器属性(如实现为getter的访问器属性)通常是不可枚举的。

size property of a MapMap.prototype的访问器属性,因此,给定Map的示例,size属性既不是own也不是可枚举的。所以它不包括在Object.entries()JSON.stringify()的结果中。

相关问题