Подтвердить что ты не робот

Как получить ключ на карте JavaScript по его значению?

У меня есть js-карта, подобная этой

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

я хочу, чтобы какой-то метод возвращал ключ по его значению

let jhonKey = people.getKey('jhon'); // jhonKey should be '1'
4b9b3361

Ответ 1

Вы можете найти его в массиве с массивом key/value.

Как это работает

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0];

части:

               [...people]

Он работает с массивом, где значения поступают из экземпляра Map, используя синтаксис распространения ..., который запускает итератор Map.prototype[@@iterator](), который дает тот же результат (потому что это ту же функцию), что и Map#entries.

               [...people].find(([, v]) => v === 'jhon')

Для нахождения значения в массиве Array#find пригодится, потому что он возвращает первый элемент, на который возвращается обратный вызов a truthy значение.

                                ([, v]) => v === 'jhon'
                                 ^^^^^

Список параметров обратного вызова содержит назначение деструктурирования и принимает только второй элемент массива, потому что это значение для проверьте внутри функции.

              ([...people].find(([, v]) => v === 'jhon') || [])[0]

Если найдено значение, которое является массивом, или если элемент не найден, то есть undefined и рассматривается как falsy, тогда логический OR || используется как оператор по умолчанию для получения пустого массива, поскольку в результате он должен вернуть первый элемент массива или undefined, если не найден.

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0];

В конце присваивается результат.

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

let jhonKey = ([...people].find(([, v]) => v === 'jhon') || [])[0];

console.log(jhonKey);

Ответ 2

Вы можете использовать цикл for..of, чтобы зацикливаться непосредственно на map.entries и получить ключи.

function getByValue(map, searchValue) {
  for (let [key, value] of map.entries()) {
    if (value === searchValue)
      return key;
  }
}

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

console.log(getByValue(people, 'jhon'))
console.log(getByValue(people, 'abdo'))

Ответ 3

Нет прямого метода для извлечения информации в этом направлении, поэтому, если все, что у вас есть, - это карта, вам нужно пройти через набор, как это было предложено другими.

Если map/array/other достаточно велик, что такой цикл будет проблемой производительности, а требование для обратного поиска является общим в проекте, вы можете реализовать свою собственную структуру, используя пару карт/массивов/других с одним в соответствии с текущим объектом, а другой с изменением ключа и значения. Таким образом, обратный поиск настолько же эффективен, как и обычный. Конечно, у вас есть больше работы, чтобы реализовать каждый метод, который вам нужен, в качестве сквозного доступа к одному или обоим базовым объектам, поэтому, если карта мала и/или обратный поиск не требуется часто, сканирование Опция -via-loop, скорее всего, будет предпочтительнее из-за того, что будет проще поддерживать и упростить компилятор JiT для оптимизации.

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