Карта не находит запись по ключу объекта - PullRequest
0 голосов
/ 22 января 2020

Я использую объект Map, когда ключ - это объект, представленный интерфейсом. По какой-то причине карта не может найти запись.

См. Мой код:

export interface IMyObject
{
    property1 : string;
    property2 : number;
} 

В моем компоненте:

MyMap : Map/*WeakMap*/<IMyObject, number[]> = new Map();

let key = { property1 : "AAA", property2: 1  } as IMyObject;
this.MyMap.set(key, [2,3,4,5]); 

В зависимости от обработчика событий:

let mapKey = { property1: "AAA", property2: 1 } as IMyObject;
var A = this.MyMap.has(mapKey); //return false

Что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Работает, когда вы говорите this.MyMap.has(key) вместо вновь созданного Объекта mapKey. Вероятно, это связано с тем, что при создании объекта в JavaScript он сохраняется с указанным c идентификатором памяти, который отличается между объектами, и MyMap.has(...), вероятно, проверяет это местоположение / идентификатор памяти, а не проверяет, действительно ли объект соответствует ключу. Это та же самая причина, по которой вы не можете сравнивать объекты с простой равной операцией.

const a = { prop1: "AAA", prop2: 1 };
const b = { prop1: "AAA", prop2: 1 };
console.log(a == b); //=> false

В любом случае, я считаю, что использование объектов в качестве ключей на карте - плохая практика, но YMMV.

Чтобы решить эту проблему, вам нужно установить глобальный объект, добавить его на карту и использовать его только для проверки, есть ли на карте указанный объект в качестве ключа.

1 голос
/ 22 января 2020
export interface IMyObject
{
    property1 : string;
    property2 : number;
}

let  MyMap  = new Map<IMyObject,number[]>();

let key = { property1 : "AAA", property2: 1  };
MyMap.set(key, [2,3,4,5]);

var b = MyMap.get(key); 
var A = MyMap.has(key); 
console.log(b);
console.log(A);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...