Хотя поздние и другие отличные ответы уже существуют, тем не менее, вы можете попробовать ниже "..." и "Array.find"

я есть карта 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'
 Bergi06 нояб. 2017 г., 17:06
Тогда почему вы хранили это неправильно? :-П

Ответы на вопрос(4)

Решение Вопроса

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

let jhonKeys = [...people.entries()]
        .filter(({ 1: v }) => v === 'jhon')
        .map(([k]) => k);

console.log(jhonKeys); // if empty, no key foudn otherwise all found keys.

 Engineer09 нояб. 2017 г., 13:58
@NinaScholz Мне любопытно, действительно ли вы используете такие однострочники в своей работе, и отлаживаете ли вы свой код каким-либо образом?
 Nina Scholz06 нояб. 2017 г., 12:26
@Rajesh, на самом деле нам нужен ключ, а не индекс.
 Keith06 нояб. 2017 г., 12:26
На самом деле нам нужен ключ, а не индекс или значение .. :)
 philraj12 сент. 2018 г., 22:40
@NinaScholz Вам не нужен доступ к массиву и|| логика, если вы деструктурируете значения карты напрямую:[...people.values()]
 Nina Scholz12 сент. 2018 г., 22:49
@philraj, я изменил ответ. Другим решением может быть использованиеArray.from с отображением значения.

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'))

 Rajesh06 нояб. 2017 г., 14:38
Просто мое личное предпочтение использоватьlet надconst.
 Keith06 нояб. 2017 г., 14:28
Хороший,. просто на головуconst работает здесь тоже вfor of, Это не работает как нормальныйfor в этой связи.
 Keith06 нояб. 2017 г., 14:15
Одним из преимуществ этого решения, возможно, является скорость, так как нет преобразования массива. Чтобы действительно проникнуться духом ES6, было бы неплохо, если бы вы изменилиvar кconst..
 Rajesh06 нояб. 2017 г., 14:22
@Keith Спасибо за указание на это. Обновили это доlet.
 philraj12 сент. 2018 г., 22:44
Вам не нужноmap.entries()сама карта действует как итератор. Я отправил правку.

поэтому, если у вас есть только карта, вам нужно пройтись по набору, как предлагают другие.

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

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

тем не менее, вы можете попробовать ниже "..." и "Array.find"

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

function getKey(value) {
  return [...people].find(([key, val]) => val == value)[0]
}

console.log('Jasmein - ',getKey('jasmein'))

console.log('Jhon - ',getKey('jhon'))

Ваш ответ на вопрос