16 votes

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

J'ai une carte js 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 renvoyer une clé par sa valeur

let jhonKey = people.getKey('jhon'); // jhonKey devrait être '1'

21voto

Nina Scholz Points 17120

Vous pourriez 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); // si vide, aucune clé trouvée sinon toutes les clés trouvées.

17voto

Rajesh Points 3413

Vous pouvez utiliser la boucle for..of pour boucler directement sur les entrées de la map 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'))

7voto

David Spillett Points 549

Il n'existe pas de méthode directe pour extraire des informations dans cette direction, donc si tout ce que vous avez est la carte, vous devez parcourir l'ensemble comme le suggèrent d'autres.

Si la carte/le tableau/autre est assez grand pour que cette boucle poserait un problème de performances et que le besoin d'une recherche inversée est courant dans le projet, vous pourriez implémenter votre propre structure en utilisant une paire de cartes/tableaux/autres dont l'un est selon l'objet actuel et l'autre avec la clé et la valeur inversées. De cette façon, la recherche inversée est aussi efficace que la normale. Bien sûr, vous avez plus de travail à faire car vous devez implémenter chaque méthode nécessaire en tant que passage à travers l'un ou l'autre des objets sous-jacents, donc si la carte est petite et/ou la recherche inverse n'est pas souvent nécessaire, l'option du scan via boucle est probablement préférable en raison de sa simplicité de maintenance et de sa simplicité possible pour l'optimisation du compilateur JiT.

En tout cas, une chose à laquelle il faut faire attention est la possibilité que plusieurs clés puissent avoir la même valeur. Si c'est le cas, alors lors du parcours de votre carte, vous devez décider si vous acceptez de renvoyer arbitrairement l'une des clés possibles (probablement la première) ou si vous souhaitez renvoyer un tableau de clés, et si vous implémentez un index inverse pour des données pouvant avoir des valeurs dupliquées, le même problème doit également être pris en compte.

3voto

Nitish Narang Points 3135

Bien que des réponses tardives et d'autres réponses formidables existent déjà, vous pouvez quand même essayer ci-dessous "..." et "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'))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X