【问题标题】:Typescript Map with objects as keys以对象为键的打字稿地图
【发布时间】:2020-09-18 02:06:27
【问题描述】:

我正在尝试构建一个以对象为键的映射,并且可能会遇到与对象实例相关的问题,并希望在这里获得一些意见。

const x = new Map<{label: string, name: number}, string>();

x.set({label: 'x', name: 122}, 'r');
x.set({label: 'x', name: 122}, 'r1');

我可以看到x 填充了两个对象键,而我实际上是在尝试更新现有的一个,当然读取这个键作为对象失败。

我的直觉是键被认为是两个不同的对象实例,我有办法实现这一点吗?

【问题讨论】:

    标签: javascript typescript ecmascript-6


    【解决方案1】:

    单独的对象不是===,一个Map可以容纳多个不是===的对象,即使它们包含相同的键和值。

    你可以通过Map的key搜索找到一个标签和名字相同的,如果存在就设置:

    const x = new Map();
    
    x.set({label: 'x', name: 122}, 'r');
    
    const newVal = 'r1';
    const foundObj = [...x.keys()].find(
      key => key.label === 'x' && key.name === 122
    );
    if (foundObj) {
      x.set(foundObj, newVal);
    } else {
      x.set({label: 'x', name: 122}, newVal);
    }
    
    console.log(x.get(foundObj));

    也就是说,这很冗长。考虑是否可以使用普通对象而不是 Map,其键是字符串化对象:

    const x = {};
    
    x[JSON.stringify({label: 'x', name: 122})] = 'r'
    
    x[JSON.stringify({label: 'x', name: 122})] = 'r1'
    
    console.log(Object.values(x));

    【讨论】:

    • 仅供参考,在您显示的方式中使用 JSON.stringify() 存在问题,因为:JSON.stringify({ label: 'x', name: 122 }) !== JSON.stringify({ name: 122, label: 'x' }) 由于键的顺序,即使键是相同的。
    • 是的,如果有可能具有相同值的不同排序属性(这很不寻常,至少在我的经验中),那么您将不得不求助于涉及 @ 初始测试的东西987654328@
    • 哦,Records (currently Stage 2)出来该多好啊!他们会解决所有这些问题......
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 2021-06-28
    • 2019-09-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2020-02-14
    相关资源
    最近更新 更多