Javascript доступ к значениям карты через ключевые объекты, которые имеют одинаковые поля, но не совпадают в памяти - PullRequest
0 голосов
/ 23 декабря 2018

Следующий код печатает неопределенный, потому что в памяти a и b не совпадают.

let map = new Map();

let obj1 = {value1: 1, value2: 2};
let obj2 = {value1: 1, value2: 2};

map.set(obj1, 'someValue');
console.log(map.get(obj2));

Я ищу способ доступа к значению, хранимому в 'someValue', с ключом объекта obj1 с другим ключом obj2, равным с точки зрения полей.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы можете взять записи объекта и отсортировать их для получения сопоставимого JSON.

function getEntries(object) {
    return JSON.stringify(Object
        .entries(object)
        .sort(([a], [b]) => a.localeCompare(b))
    );
}

var map = new Map(),
    obj1 = { value1: 1, value2: 2 },
    obj2 = { value2: 2, value1: 1 };

map.set(getEntries(obj1), 'someValue');
console.log(map.get(getEntries(obj2)));
0 голосов
/ 23 декабря 2018

Я бы предложил вам создать хеш из вашего объекта.Обычная stringify может потерпеть неудачу, если ваши свойства находятся в другом порядке.Например:

JSON.stringify({a: 1, b:2}) !== JSON.stringify({b: 2, a:1})

Вы можете использовать такой модуль, как хэш-код или object-hash для создания хэша, например:

map.set(encode().value(obj1), 'someValue')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...