Tengo un objeto JavaScript bastante simple, que uso como una matriz asociativa. ¿Existe una función simple que me permita obtener la clave para un valor, o tengo que iterar el objeto y encontrarlo manualmente?
javascript
object
arik
fuente
fuente
var o = []; var map = {first: o, second: o}
. ¿Quéfind_key(o)
volvería?Respuestas:
Con la biblioteca Underscore.js :
fuente
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, sin mutaciones prototipo o bibliotecas externas.
Ejemplo,
fuente
keys()
materializa el conjunto de claves.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
No hay un método estándar disponible. Necesita iterar y puede crear un ayudante simple:
Una advertencia : incluso si lo anterior funciona, generalmente es una mala idea extender cualquier host u objeto nativo
.prototype
. Lo hice aquí porque encaja muy bien con el problema. De todos modos, probablemente debería usar esta función fuera del.prototype
y pasar el objeto en su lugar.fuente
.toString()
gustaobj[ key ].toString()
y al valor si lo desea ...Como se dijo, se necesita iteración. Por ejemplo, en el navegador moderno podría tener:
Donde
value
contiene el valor que estás buscando. Dicho eso, probablemente usaría un bucle.De lo contrario, podría usar un objeto "hashmap" adecuado (hay varias implementaciones en JS) o implementarlo usted mismo.
ACTUALIZACIÓN 2018
Pasaron seis años, pero todavía obtengo algo de voto aquí, así que siento que una solución más moderna, para el navegador / entorno moderno, debería mencionarse en la respuesta en sí y no solo en los comentarios:
Por supuesto, también puede ser una función:
fuente
Object.keys(obj).or(o=>o[key] === value)
or
matriz método, y no está claro para mí su propósito aquí: ¡apreciaré algunos detalles adicionales! :)or
¡Seguro! Fue evaluado y aceptado recientemente (no creo que nadie lo implemente todavía). Lo que hace es encontrar el primer elemento de una matriz que coincida con un predicado y devolverlo. Entonces[1,2,3,4].or(x=>x>2)
volvería3
y[1,2,3,4,5].or(x=>x<3)
volvería1
. Algo así como FirstOrDefault de C # :)or
método? Por lo que mencionó, ¿parece que devuelve el elemento que coincide con el predicado "o" la matriz misma?or
se cambió el nombre. Creo que ahora deberías usar find .La forma lodash https://lodash.com/docs#findKey
fuente
_.findKey(users, { 'age': 1, 'active': true });
... es lo mismo_.find_key({a: "A", b:"B"}, "B"})
vuelve,undefined
como se indica aquí , debe hacerlo_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Hecho para el compilador de cierre para extraer el nombre clave que será desconocido después de la compilación
Versión más sexy pero con
Object.entries
función futurafuente
Object.entries(obj).find(i => i[1] === val);
usarfilter
en su lugarObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + One Liners
Devuelve todas las claves con el valor:
fuente
Yo uso esta función:
Uso:
fuente
obj.hasOwnProperty(key)
o es innecesario en este caso?Función principal:
Objeto con claves y valores:
Prueba:
fuente
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Ejemplo:
fuente
Si está trabajando con la biblioteca Underscore o Lodash , puede usar la función _.findKey :
fuente
He creado el BIMAP biblioteca ( https://github.com/alethes/bimap ) que implementa un potente, flexible y eficiente interfaz del mapa bidireccional JavaScript. No tiene dependencias y se puede usar tanto en el lado del servidor (en Node.js, puede instalarlo con
npm install bimap
) como en el navegador (al vincular a lib / bimap.js ).Las operaciones básicas son realmente simples:
La recuperación del mapeo clave-valor es igualmente rápida en ambas direcciones. No hay recorridos costosos de objetos / conjuntos debajo del capó, por lo que el tiempo de acceso promedio permanece constante independientemente del tamaño de los datos.
fuente
no vi lo siguiente:
fuente
Como los valores son únicos, debería ser posible agregar los valores como un conjunto adicional de claves. Esto podría hacerse con el siguiente acceso directo.
Esto permitiría la recuperación a través de la clave o el valor:
Esto supone que no hay elementos comunes entre las claves y los valores.
fuente
Dado
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):fuente
output['x']
. ¿Es eso lo que preguntabas?http://jsfiddle.net/rTazZ/2/
fuente
O, aún más fácil: cree un nuevo objeto con las claves y los valores en el orden que desee y luego busque ese objeto. Hemos tenido conflictos al usar los códigos prototipo anteriores. No tiene que usar la función String alrededor de la tecla, eso es opcional.
fuente
Esta es una pequeña extensión del método Underscorejs, y utiliza Lodash en su lugar:
FindKey buscará y devolverá la primera clave que coincida con el valor.
Si desea la última coincidencia, use FindLastKey en su lugar.
fuente
Como si esta pregunta no hubiera sido superada ...
Aquí hay uno para cualquier curiosidad que te traiga ...
Si está seguro de que su objeto solo tendrá valores de cadena, realmente podría agotarse para evocar esta implementación:
Tal vez hay algo útil para construir desde aquí ...
Espero que esto te divierta.
fuente
Aquí hay una solución de Lodash para esto que funciona para la clave plana => objeto de valor, en lugar de un objeto anidado. La sugerencia de la respuesta aceptada de usar
_.findKey
funciona para objetos con objetos anidados, pero no funciona en esta circunstancia común.Este enfoque invierte el objeto, intercambiando claves por valores, y luego encuentra la clave buscando el valor en el nuevo objeto (invertido). Si no se encuentra la clave,
false
se devuelve, lo cual prefieroundefined
, pero podría cambiarlo fácilmente en el tercer parámetro del_.get
métodogetKey()
.fuente
Aquí está mi solución primero:
Por ejemplo, supongo que tenemos un objeto que contiene tres pares de valores:
Simplemente podemos escribir una FindKey (matriz, valor) que toma dos parámetros que son un objeto y el valor de la clave que está buscando. Como tal, este método es reutilizable y no necesita iterar manualmente el objeto cada vez pasando solo dos parámetros para esta función.
fuente
Métodos ES6 :
fuente
Normalmente recomiendo lodash en lugar de subrayar.
Si lo tienes, úsalo.
Si no lo hace, debería considerar usar el paquete lodash.invert npm, que es bastante pequeño.
Así es como puedes probarlo con trago:
1) Cree un archivo llamado gulpfile.js con el siguiente contenido:
2) Instale el paquete lodash.invert y trague
3) Probar que funciona:
Referencias
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Diferencias entre lodash y subrayado
https://github.com/gulpjs/gulp
fuente
Subrayar js solución
fuente
Esto me funcionó para obtener la clave / valor del objeto.
fuente
Realmente sencillo.
fuente
¡Mantenlo simple!
No necesita filtrar el objeto a través de métodos sofisticados o libs, Javascript tiene una función incorporada llamada Object.values .
Ejemplo:
Esto devolverá los datos de propiedad del objeto.
Referencias
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
fuente