web-dev-qa-db-fra.com

Comment obtenir une clé dans une carte JavaScript par sa valeur?

J'ai une carte comme celle-ci 

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

ce que je veux, c'est une méthode pour retourner une clé par sa valeur

let jhonKey = people.getKey('jhon'); // jhonKey should be '1'
15
Engineer Passion

Vous pouvez le rechercher dans un tableau d'entrées.

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.

17
Nina Scholz

Vous pouvez utiliser la boucle for..of pour parcourir directement la map.entries et obtenir les clés.

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

18
Rajesh

Il n'y a pas de méthode directe pour extraire des informations dans cette direction. Si vous ne disposez que de la carte, vous devez parcourir l'ensemble tel que suggéré par d'autres.

Si map/array/other est suffisamment grand pour qu'une telle boucle pose un problème de performances et que la recherche inversée soit courante dans le projet, vous pouvez implémenter votre propre structure à l'aide d'une paire de mappes/matrices/autre avec un comme par l'objet en cours et l'autre avec la clé et la valeur inversées. De cette façon, la recherche inversée est aussi efficace que la recherche normale. Bien sûr, vous avez plus de travail à faire car vous devez implémenter chaque méthode dont vous avez besoin comme passerelle vers l'un des objets sous-jacents ou les deux. Par conséquent, si la carte est petite et/ou si la recherche inversée n'est pas nécessaire, l'analyse est souvent nécessaire. L'option -via-loop sera probablement préférable en raison de sa simplicité de maintenance et de son optimisation possible pour le compilateur JiT.

Dans tous les cas, il faut se méfier de la possibilité que plusieurs clés aient la même valeur. Si cela est possible, lorsque vous parcourez votre carte, vous devez décider si vous êtes en mesure de renvoyer une des clés possibles de manière arbitraire (probablement la première) ou si vous souhaitez renvoyer un tableau de clés, et si vous implémentez un index inverse. pour les données pouvant avoir des valeurs en double, le même problème doit également être pris en compte.

7
David Spillett

Bien que les réponses tardives et autres excellentes existent déjà, vous pouvez toujours essayer ci-dessous "..."

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

1
Nitish Narang