【问题标题】:How to get map element by key object?如何通过关键对象获取地图元素?
【发布时间】:2021-11-12 03:36:12
【问题描述】:

有一个代码:

let a = new Map<{id: number, age: number}, string>();

a.set({id: 1, age: 20}, "1");

console.log(a.get({id:1, age: 20}));

它给了我undefined,因为添加到地图的对象和查找对象不相等。是否可以在地图中制作复杂的键以在何时检索它?

我可以这样做:

  let a = new Map<string, string>();

其中string key是concatination:id_age,但我不喜欢这个,因为不是很明显

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    对象通过引用而不是值来工作。这意味着{ a: 5, b: 6 } !== { a: 5, b: 6 }

    您可以做的是创建一个具有自定义 equals 方法的类,该方法按值比较属性,而不是您当前拥有的对象键:

    export default class Person {
      public id: number;
      public age: number;
      
      constructor(id: number, age: number) {
        this.id = id;
        this.age = age;
      }
    
      public equals(obj: any): boolean {
        return obj && typeof obj === 'object' && obj.id === this.id && obj.age === this.age;
      } 
    } 
    

    然后在你的地图中使用它:

    const map = new Map<Person, string>();
    
    map.set(new Person(1, 20), '1');
    console.log(map.get(new Person(1, 20)); // '1'
    

    【讨论】:

      【解决方案2】:

      如果你想在Map 上设置一个value(一个object),那么当你想从对象中获取value 时,你应该有对象引用,

      因为在 JS 中没有两个相同的对象是相等的,{} !== {}

      let a = new Map();
      
      const o = { id: 1, age: 20 };
      a.set(o, "1");
      
      console.log(a.get(o));

      【讨论】:

      • 是的,我知道,所以我需要o对象来操作地图或一些地图,对吧?
      • 没错,添加object时需要相同的对象,从地图中获取值时也需要相同的对象。
      猜你喜欢
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2016-10-05
      • 2017-06-03
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多