554 votes

Objet Javascript obtenir la clé en valeur

J'ai un assez simple objet Javascript, que j'utilise comme un tableau associatif. Est-il une fonction simple me permettant d'obtenir la clé pour un objet, ou dois-je effectuer une itération de l'objet et de trouver manuellement? Dans le cas où y est une fonction, qui est-il?

186voto

jAndy Points 93076

Aucune méthode standard disponibles. Vous avez besoin d'itérer et vous pouvez créer un helper:

Object.prototype.getKeyByValue = function( value ) {
    for( var prop in this ) {
        if( this.hasOwnProperty( prop ) ) {
             if( this[ prop ] === value )
                 return prop;
        }
    }
}

var test = {
   key1: 42,
   key2: 'foo'
};

test.getKeyByValue( 42 );  // returns 'key1'

Un mot de prudence: Même si les travaux ci-dessus, il est en général une mauvaise idée de s'étendre à tous hôte ou un objet natif de l' .prototype. Je l'ai fait ici, car elle répond à la question très bien. De toute façon, vous devriez probablement utiliser cette fonction à l'extérieur de l' .prototype et passer de l'objet au lieu.

152voto

ZER0 Points 7358

Comme l'a dit, l'itération est nécessaire. Par exemple, dans le navigateur moderne tel que vous pourriez avoir:

var key = Object.keys(obj).filter(function(key) {return obj[key] === value})[0];

value contient la valeur que vous recherchez. Dit que je serais probablement utiliser une boucle.

Sinon, vous pouvez utiliser un "table de hachage" de l'objet il y a plusieurs mise en œuvre en JS autour - ou à mettre en œuvre par votre propre.

92voto

banyan Points 434

avec Underscore.js

var hash = {
 foo: 1,
 bar: 2
};

(_.invert(hash))[1]; // => 'foo'

27voto

Benny Neugebauer Points 5393

J'utilise cette fonction:

Object.prototype.getKey = function(value){
  for(var key in this){
    if(this[key] == value){
      return key;
    }
  }
  return null;
};

Utilisation:

// ISO 639: 2-letter codes
var languageCodes = {
  DA: 'Danish',
  DE: 'German',
  DZ: 'Bhutani',
  EL: 'Greek',
  EN: 'English',
  EO: 'Esperanto',
  ES: 'Spanish'
};

var key = languageCodes.getKey('Greek');
console.log(key); // EL

15voto

Alethes Points 334

J'ai créé le bimap bibliothèque (https://github.com/alethes/bimap) qui met en œuvre puissante, flexible et efficace en JavaScript bidirectionnel de la carte d'interface. Il n'a pas de dépendances et est utilisable à la fois sur le côté serveur (en Node.js vous pouvez l'installer avec npm install bimap) et dans le navigateur (par un lien vers lib/bimap.js).

Opérations de base sont très simples:

var bimap = new BiMap;
bimap.push("k", "v");
bimap.key("k") // => "v"
bimap.val("v") // => "k"

bimap.push("UK", ["London", "Manchester"]);
bimap.key("UK"); // => ["London", "Manchester"]
bimap.val("London"); // => "UK"
bimap.val("Manchester"); // => "UK"

Récupération de la valeur-clé de la cartographie est aussi rapide dans les deux directions. Il n'y a pas coûteux objet/tableau traversals sous le capot de sorte que le temps d'accès moyen reste constant quelle que soit la taille des données.

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