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?
Réponses
Trop de publicités?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.
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];
Où 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.
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
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.