首页 > 解决方案 > 从打字稿中的键访问值

问题描述

在我的打字稿应用程序中,我有以下格式的 config.json:

EventFilters": [
      {
        "Name": "AppLaunch",
        "Version": "2"
      },
      {
        "Name": "messageDisplayed",
        "Version": "2"
      },
      {
        "ID": "40021",
        "Version": "2"
      }
    ]

现在,在我的 .ts 文件中,我想读取这些键值对,我正在使用以下代码:

[![let eventfilters: Object\[\] = this.getEventFilters();           // this method reads the event filters from the config, as shown in the image

let keys: Object\[\];
for (let i: number = 0; i < eventfilters.length; i++) {
    keys = Object.keys(eventfilters\[i\]);
    for (let j: number = 0; j < keys.length; j++) {
        if(eventfilters\[i\]\[keys\[j\]\] === \[/*Parameter 2 to compare*/\]){
            //do something
        }
    }
}]

来自事件过滤器控制台的屏幕截图

我正在尝试使用以下'eventfilters [i] [keys [j]]'比较'if'语句中的值。但是,它抛出以下错误'类型'对象'不能用作索引类型。'。

但是,当我在浏览器控制台中使用以下语句时,它会返回键的值“eventfilters[0][0]”

由于 typescript 和 ecmascript 的版本,我不能使用以下内容:

Object.values(eventfilters[i]); 或 Object.entries(eventfilters[i]);

抱歉,问题很长,并在此先感谢。

标签: javascripttypescriptecmascript-6key-value

解决方案


您的“键”变量被声明为 Object[],它不能用作数组中的索引。

在这种情况下,您应该使用字符串数组:

let keys: string[];

但是,由于您没有一个类来存储对象,所以它也不起作用。角度不能相信来自对象的所有索引都将始终是一个字符串。

因此,在这种情况下,您可以放弃索引方法并使用以下方法:

EventFilters.forEach(obj => {
    Object.entries(obj).forEach(([key, value]) => {
        console.log('${key} ${value}');
    });
});

不使用 Object.entries 的方法

您还可以对 EventFilters 数组上的记录强制一个类型。

const EventFilters: Record<string, any> = [
    {
        "Name": "AppLaunch",
        "Version": "2"
    },
    {
        "Name": "messageDisplayed",
        "Version": "2"
    },
    {
        "ID": "40021",
        "Version": "2"
    }
];


let keys: any[];
for (let i: number = 0; i < EventFilters.length; i++) {
    for (const key in EventFilters[i]) {
        console.log(key);
        console.log(EventFilters[i][key]);
    };
}

推荐阅读