@varytimop

Как получить значение map, где ключ — массив?

Здравствуйте, помогите пожалуйста разобраться как мне необходимо исправить не рабочий код
let map = new Map();
map.set([1, false], "hello world");
console.log(map.get([1, false]));
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 3
@VladimirAsmo
У вас на второй и третьей строчке разные массивы. Сохраните массив в переменную:
const key = [1, false];
const map = new Map();
map.set(key, "hello world");
console.log(map.get(key));
Ответ написан
В вашем коде два одинаковых массива это две разные ссылки, на разные области памяти. Если хотите в качестве ключа использовать объект или массив, нужно сохранять ссылки. Видимо на самом деле у вас проблемы с постановкой задачи, не вижу в каком случае может возникнуть необходимость использовать массив в качестве ключа
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Ткнуть в доку лучше готового к копипасте ответа
Такое возможно, если обернуть Map в свою реализацию, которая содержит вложенные Map и разворачивает ключи рекурсивно:
const VALUE_KEY = Symbol();

class RecurrentMap {
    #map = new Map();

    get(keys) {
        return this.#getTargetMap(keys)?.get(VALUE_KEY);
    }

    set(keys, value) {
        this.#checkKeys(keys);
        let map = this.#map;
        for (const key of keys) {
            if (!map.has(key)) {
                map.set(key, new Map());
            }
            map = map.get(key);
        }
        map.set(VALUE_KEY, value);
    }

    has(keys) {
        return this.#getTargetMap(keys)?.has(VALUE_KEY) ?? false;
    }

    #checkKeys(keys) {
        if (!Array.isArray(keys)) {
            throw new TypeError('keys must be array');
        }
    }

    #getTargetMap(keys) {
        this.#checkKeys(keys);
        let map = this.#map;
        for (const key of keys) {
            if (!map.has(key)) { return }
            map = map.get(key);
        }
        return map;
    }
}

Тогда с примитивными значениями вполне будет работать:
let map = new RecurrentMap();
map.set([1, false], "hello world");
console.log(map.get([1, false]));
Но вот если в ключах окажется объект или функция, то все равно на него понадобится ссылка
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы