J'ai un objet JavaScript assez simple, que j'utilise comme tableau associatif. Existe-t-il une fonction simple me permettant d'obtenir la clé d'une valeur, ou dois-je itérer l'objet et le trouver manuellement?
javascript
object
arik
la source
la source
var o = []; var map = {first: o, second: o}
. Quefind_key(o)
reviendrait?Réponses:
Avec la bibliothèque Underscore.js :
la source
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, pas de mutations prototypes ni de bibliothèques externes.
Exemple,
la source
keys()
matérialise le jeu de clés.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Pas de méthode standard disponible. Vous devez itérer et vous pouvez créer un assistant simple:
Un mot d'avertissement : même si ce qui précède fonctionne, c'est généralement une mauvaise idée d'étendre n'importe quel hôte ou objet natif
.prototype
. Je l'ai fait ici parce que cela correspond très bien au problème. Quoi qu'il en soit, vous devriez probablement utiliser cette fonction en dehors de.prototype
et y passer l'objet à la place.la source
.toString()
commeobj[ key ].toString()
et à la valeur si vous le souhaitez ...Comme dit, l'itération est nécessaire. Par exemple, dans un navigateur moderne, vous pourriez avoir:
Où
value
contient la valeur que vous recherchez. Dit cela, j'utiliserais probablement une boucle.Sinon, vous pouvez utiliser un objet "hashmap" approprié - il existe plusieurs implémentations dans JS - ou l'implémenter par vous-même.
MISE À JOUR 2018
Six ans se sont écoulés, mais j'ai encore un certain vote ici, donc je pense qu'une solution plus moderne - pour un navigateur / environnement moderne - devrait être mentionnée dans la réponse elle-même et pas seulement dans les commentaires:
Bien sûr, cela peut aussi être une fonction:
la source
Object.keys(obj).or(o=>o[key] === value)
or
tableau méthode, et ce n'est pas clair pour moi son but ici: j'apprécierai quelques détails supplémentaires! :)or
sûr! Il n'a été évalué et accepté que récemment (je pense que personne ne le met encore en œuvre). Ce qu'il fait, c'est trouver le premier élément d'un tableau correspondant à un prédicat et le renvoyer. Donc[1,2,3,4].or(x=>x>2)
reviendrait3
et[1,2,3,4,5].or(x=>x<3)
reviendrait1
. Quelque chose comme FirstOrDefault de C # :)or
méthode? D'après ce que vous avez mentionné, il semble qu'il renvoie l'élément qui correspond au prédicat "ou" le tableau lui-même?or
été renommé. Je crois que maintenant tu devrais utiliser find .La manière lodash https://lodash.com/docs#findKey
la source
_.findKey(users, { 'age': 1, 'active': true });
... c'est la même chose_.find_key({a: "A", b:"B"}, "B"})
retourneundefined
donc comme indiqué ici, vous devez faire_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Conçu pour le compilateur de fermeture pour extraire le nom de la clé qui sera inconnu après la compilation
Version plus sexy mais utilisant la
Object.entries
fonction futurela source
Object.entries(obj).find(i => i[1] === val);
utiliser à lafilter
placeObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + One Liners
Renvoie toutes les clés avec la valeur:
la source
J'utilise cette fonction:
Usage:
la source
obj.hasOwnProperty(key)
ou est-ce inutile dans ce cas?Fonction principale:
Objet avec clés et valeurs:
Tester:
la source
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Exemple:
la source
Si vous travaillez avec la bibliothèque Underscore ou Lodash , vous pouvez utiliser la fonction _.findKey :
la source
J'ai créé la bibliothèque bimap ( https://github.com/alethes/bimap ) qui implémente une interface de carte bidirectionnelle JavaScript puissante, flexible et efficace. Il n'a pas de dépendances et est utilisable à la fois côté serveur (dans Node.js, vous pouvez l'installer avec
npm install bimap
) et dans le navigateur (en créant un lien vers lib / bimap.js ).Les opérations de base sont vraiment simples:
La récupération du mappage de valeur-clé est également rapide dans les deux sens. Il n'y a pas de traversées d'objets / tableaux coûteuses sous le capot, donc le temps d'accès moyen reste constant quelle que soit la taille des données.
la source
n'a pas vu ce qui suit:
la source
Étant donné que les valeurs sont uniques, il devrait être possible d'ajouter les valeurs en tant que jeu de clés supplémentaires. Cela pourrait être fait avec le raccourci suivant.
Cela permettrait la récupération soit via la clé ou la valeur:
Cela suppose qu'il n'y a pas d'éléments communs entre les clés et les valeurs.
la source
Étant donné
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):la source
output['x']
. C'est bien ce que vous demandiez?http://jsfiddle.net/rTazZ/2/
la source
Ou, encore plus simple - créez un nouvel objet avec les clés et les valeurs dans l'ordre souhaité, puis recherchez cet objet. Nous avons eu des conflits en utilisant les codes prototypes ci-dessus. Vous n'avez pas besoin d'utiliser la fonction String autour de la clé, qui est facultative.
la source
Il s'agit d'une petite extension de la méthode Underscorejs, et utilise Lodash à la place:
FindKey va chercher et retourner la première clé qui correspondla valeur.
Si vous souhaitez plutôt la dernière correspondance, utilisezplutôt FindLastKey .
la source
Comme si cette question n'avait pas été battue en bouillie ...
En voici une juste pour la curiosité qu'elle vous apporte ...
Si vous êtes sûr que votre objet n'aura que des valeurs de chaîne, vous pourriez vraiment vous épuiser pour évoquer cette implémentation:
Peut-être qu'il y a quelque chose d'utile à construire à partir d'ici ...
J'espère que cela vous amusera.
la source
Voici une solution Lodash à cela qui fonctionne pour un objet clé => valeur, plutôt qu'un objet imbriqué. La suggestion de réponse acceptée à utiliser
_.findKey
œuvres pour les objets avec des objets imbriqués, mais cela ne fonctionne pas dans cette circonstance courante.Cette approche inverse l'objet, en échangeant des clés contre des valeurs, puis trouve la clé en recherchant la valeur sur le nouvel objet (inversé). Si la clé n'est pas trouvée, elle
false
est renvoyée, ce que je préfèreundefined
, mais vous pouvez facilement l'échanger dans le troisième paramètre de la_.get
méthode dansgetKey()
.la source
Voici ma solution d'abord:
Par exemple, je suppose que nous avons un objet qui contient trois paires de valeurs:
Nous pouvons simplement écrire une findKey (tableau, valeur) qui prend deux paramètres qui sont un objet et la valeur de la clé que vous recherchez. En tant que telle, cette méthode est réutilisable et vous n'avez pas besoin d'itérer manuellement l'objet à chaque fois en ne passant que deux paramètres pour cette fonction.
la source
Méthodes ES6 :
la source
Je recommande généralement le lodash plutôt que le soulignement.
Si vous l'avez, utilisez-le.
Si vous ne le faites pas, vous devriez envisager d'utiliser le paquet nash lodash.invert, qui est assez petit.
Voici comment vous pouvez le tester à l'aide de gulp:
1) Créez un fichier appelé gulpfile.js avec le contenu suivant:
2) Installez le paquet lodash.invert et gulp
3) Vérifiez que cela fonctionne:
Références
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Différences entre lodash et underscore
https://github.com/gulpjs/gulp
la source
Souligner la solution js
la source
cela a fonctionné pour moi pour obtenir la clé / valeur de l'objet.
la source
Vraiment simple.
la source
Rester simple!
Vous n'avez pas besoin de filtrer l'objet à l'aide de méthodes sophistiquées ou de bibliothèques, Javascript a une fonction intégrée appelée Object.values .
Exemple:
Cela renverra les données de propriété de l'objet.
Références
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
la source