Вот код:

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>();

Где строковый ключ является объединением: id_age, но мне это не нравится, потому что это не очевидно

0
Beginner 17 Сен 2021 в 11:41

2 ответа

Лучший ответ

Если вы хотите установить value (object) на Map, тогда у вас должна быть ссылка на объект, когда вы хотите получить value от объекта,

Поскольку не два одинаковых объекта равны в JS, {} !== {}

let a = new Map();

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

console.log(a.get(o));
0
HR01M8055 17 Сен 2021 в 08:46

Объекты работают по ссылке, а не по значению. Это означает, что { 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'
1
Eldar B. 17 Сен 2021 в 08:52