Вызовите ключ массива объекта карты - PullRequest
2 голосов
/ 17 января 2020

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

Как показано в приведенном ниже коде, я могу map.get (arr) , но не map.get ([0, 1, 2, 3])

const map = new Map()
const arr = [0,1,2,3]
map.set(arr, "I am some number")

map.get(arr) // "I am some number"
map.get([0,1,2,3]) // undefined

Ответы [ 4 ]

4 голосов
/ 17 января 2020

Вы не можете. Map сравнивает объекты по идентичности объекта. [0, 1, 2, 3] !== [0, 1, 2, 3] так как они разные объекты , даже если они содержат одни и те же данные.

Самое близкое, что вы можете сделать, это попытаться преобразовать массив во что-то, что вы можете многозначительно сравнить:

const map = new Map()
const arr = [0,1,2,3]
map.set(JSON.stringify([0, 1, 2, 3]), "I am some number")

console.log(map.get(JSON.stringify([0, 1, 2, 3])))
2 голосов
/ 17 января 2020

Это правильно, вы должны использовать тот же массив (как в map.get(arr)), а не просто эквивалентный массив. Сравнение клавиш похоже на === (за исключением того, что NaN соответствует самому себе). Так вот, как это показывает false:

console.log([0, 1, 2, 3] === [0, 1, 2, 3]); // false

... при использовании map.get([0, 1, 2, 3]) гарантированно ничего не будет найдено, потому что на карте нет записей в ключе этого массива.

0 голосов
/ 17 января 2020

Вам нужна та же ссылка на объект для получения значения из Map.

Если вы хотите использовать в качестве ключа начальную часть массива, вам нужно получить все ключи с карты и проверить с новым массивом.

var map = new Map,
    key0 = [0, 1, 2, 3],
    key1 = [0, 1, 2, 3];

map.set(key0, "I am some number");
console.log(map.get(key0)); // "I am some number"

for (let key of map.keys())
    if (key.join('|') === key1.join('|'))
        console.log(map.get(key));
0 голосов
/ 17 января 2020

Отдельные массивы не === друг для друга - ваш arr не ссылается на тот же контейнер массива, что и [0,1,2,3], который вы передаете map.get. Чтобы сделать что-то вроде этого, вам нужно будет перебрать ключи карты и найти тот, все значения которого совпадают:

const map = new Map()
const arr = [0,1,2,3];
map.set(arr, "I am some number")

// Get a reference to the same `arr` whose key you set previously:
const arrKey = [...map.keys()].find(
  key => Array.isArray(key) && JSON.stringify(key) === JSON.stringify([0, 1, 2, 3])
);
console.log(map.get(arrKey));

(но это довольно уродливая вещь, которую нужно сделать - если вам это нужно, обычно было бы лучше использовать другую структуру данных)

...