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