JavaScript объект карты не сохраняет ключи объекта? - PullRequest
0 голосов
/ 17 февраля 2020

Итак, я пытаюсь добавить запись к объекту карты с ключом, являющимся объектом, но, похоже, он не работает.

let myMap = new Map();
myMap.set({type : 'sum', val : 10},1);
console.log(myMap.get({type:'sum',val:10})); <---- this returns undefined

почему он возвращает значение undefined вместо 1?

Ответы [ 6 ]

1 голос
/ 17 февраля 2020

javascriot использует алгоритм SameValueZero для хранения ключа при установке и получении из этой структуры. SameValueZero похож на строгое равенство (===). поскольку в методе get вы создаете новый объект и передаете его этому методу в качестве ключа, этот ключ не совсем равен объекту, который вы используете при установке, поэтому вы получаете null.

1 голос
/ 17 февраля 2020

Причина в том, что объекты являются ссылками на значения в JavaScript. Таким образом, два объекта, даже с одинаковым значением, оцениваются как разные, поскольку они хранятся как два разных значения. Если вы используете то же самое, вы получите ожидаемый результат:

let myMap = new Map();
const key = {type : 'sum', val : 10}
myMap.set(key, 1);
console.log(myMap.get(key)); // 1
0 голосов
/ 17 февраля 2020

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

let myMap = new Map();
var obj = {type : 'sum', val : 10};
myMap.set(obj,1);
console.log(myMap.get(obj));
0 голосов
/ 17 февраля 2020

Карта - это пара ключ-значение, в которой вы сохраняете значение с его ключом. Например:

let map = new Map();
         // key     // value
map.set('myKey','just a text');

, чтобы получить доступ к этому значению, в этом случае вам понадобится ключ 'myKey'

map.get('myKey'); // will return just a text

, если вы хотите sh преобразовать ваш объект в карту, следуйте этой статье :

let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));

alert( map.get('name') ); // John
0 голосов
/ 17 февраля 2020

Даже если ваши два объекта, используемые в качестве ключа, выглядят равными (потому что они имеют одинаковые атрибуты), они не являются (в соответствии с ===, что более или менее используется операция - см. Здесь для получения более подробной информации ).

Это будет работать, если вы выполните следующие действия:

let myMap = new Map();
var obj = {type : 'sum', val : 10};
myMap.set(obj,1);
console.log(myMap.get(obj));
0 голосов
/ 17 февраля 2020

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

 myMap.set({type : 'sum', val : 10},1);
 myMap.set( {key:1, val: {type : 'sum', val : 10}} );

Попробуйте использовать ключ и добавить объект {type: '', val: ''} к это как его ценность. Попробуйте обернуть '1' в сам объект

Поскольку вам потребуется ключ для доступа к нему.

Ссылка: [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map] [1]

Вернется myMap.size

...