【问题标题】:Access values from keys in typescript从打字稿中的键访问值
【发布时间】:2021-06-17 19:33:34
【问题描述】:

在我的打字稿应用程序中,我的 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]);

对这个冗长的问题表示歉意,并提前致谢。

【问题讨论】:

    标签: javascript typescript ecmascript-6 key-value


    【解决方案1】:

    您的“keys”变量被声明为 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]);
        };
    }
    

    【讨论】:

    • 感谢您的回复,但正如我在问题中已经提到的那样,我无法使用“Object.values”和“Object.entries”,因为我收到此错误“Property 'entries' does not存在于类型“ObjectConstructor”上。根据 MDN,Object.entries 是在 ES2017 规范中正式添加的,我使用的是在此之前的东西,我不允许升级它。
    • 知道了,您需要数组中的键还是值?
    • 我们需要键和值,因为在上面的 IF 条件下,键也将用于从第二个参数中提取值。
    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 2017-06-19
    • 2022-01-12
    • 1970-01-01
    • 2021-08-30
    • 2020-06-04
    • 2018-02-02
    • 2018-11-12
    相关资源
    最近更新 更多