2012-03-14 19 views
6

Entiendo que esto es un poco heterodoxo.¿Cómo puedo obtener un nombre de clave (en un hash) usando su valor?

Digamos que tengo este hash.

someHash = { 
    'item1' => '5', 
    'item2' => '7', 
    'item3' => '45', 
    'item4' => '09' 
} 

Usando js nativos, o prototipo o jQuery - ¿existe un método que me permitirá conseguir el "nombre clave" con sólo tener el valor?

No quiero todas las llaves, solo la que coincida con mi valor. ¿Sorta de un mapa como al revés?

Estoy obteniendo un retorno de la base de datos que obtengo un "valor" y tengo que hacer coincidir ese valor con algo de hash js en la parte delantera.

Así que la aplicación me da "45" ... ¿Hay alguna forma de usar js (prototype o jquery) para obtener la clave "item3"?

+2

Vas a tener que iterar sobre cada llave solo par/valor y la rentabilidad la primera clave que contiene tu valor – Blender

+0

Los valores hash no funcionan de esa manera. Proporcionan una búsqueda eficiente de la clave para obtener el valor.A la inversa, se requiere la iteración de (posiblemente) cada tecla individual hasta que encuentre el valor coincidente. Simplemente invierta su definición de clave y valor. –

+0

Para matrices normales, puede usar '.indexOf', pero está hablando de un bucle a través de los elementos del objeto. – Brad

Respuesta

4

Para obtener las claves que se asignan a un valor determinado, deberá buscar las propiedades del objeto. Por ejemplo

function getKeysForValue(obj, value) { 
    var all = []; 
    for (var name in obj) { 
    if (Object.hasOwnProperty(name) && obj[name] === value) { 
     all.push(name); 
    } 
    } 
    return all; 
} 
+0

¿Qué sucede si el valor es una matriz? como {a: ['b', 'c', 'd']} – Jazmin

2

No hay un método directo pero puede intentar algo como esto.

var key; 
$.each(someHash, function(key, val){ 
    if(val == 'valToCompare'){ 
     key = key; 
     return false; 
    } 
}); 
+0

'break' no funciona porque no tiene un bucle real. Necesitas 'devolver falso'. – pimvdb

+0

'break' no tiene sentido aquí – kirilloid

+0

Corregido eso, gracias. – ShankarSangoli

2

Sin singularidad se puede obtener la primera:

var hash = {item1: 0, item2: 1}, 
    value = 1, 
    key; 
for(var i in hash) 
{ 
    if (hash.hasOwnProperty(i) && hash[i] === value) { 
     key = i; 
     break; 
    } 
} 
key; // item2 

hasOwnProperty asegura que tiene la propiedad de hash no es un prototipo.

break detiene el ciclo una vez que se encuentra una clave.

2

No sé de una respuesta nativa, pero se puede escribir su propia:

var someHash = { 
    'item1' : '5', 
    'item2' : '7', 
    'item3' : '45', 
    'item4' : '09' 
}; 

function getKeyByValue(hash, value) { 
    var key; 
    for(key in hash) { 
    if (hash[key] == value) return key; 
    } 
} 

alert(getKeyByValue(someHash, '7')); 
0

Quizás array_flip podría ayudarle. Esto hace una nueva matriz donde las claves son los valores y viceversa. Luego, solo busca la clave en esa nueva matriz, y el valor resultante es la clave en la matriz original que estabas buscando.

0

Pasa por el objeto.

function findInObj(obj, needle) 
    for(var x in obj){ 
     if(obj.x==needle) return x; 
    } 
    return false; 
} 
+0

Wow. las respuestas vienen rápido en este sitio. – whiteatom

+2

'obj.x' debe ser' obj [x] ' –

0

Desde más de una propiedad de un objeto puede tener el mismo valor, que podría devolver una matriz de los nombres de propiedades que coinciden con el valor.

var someHash={ 
    'item1':'5', 
    'item2':'7', 
    'item3':'45', 
    'item4':'09', 
    'item5':'7' 
} 
function hasAny(what){ 
    var names= []; 
    for(var p in this){ 
     if(this[p]=== what) names.push(p); 
    } 
    return names; 
} 

hasAny.call (someHash, '7');

/* Valor devuelto: (Array) elemento2, item5 */

4

underscore.js usando:

_.invert(someHash)[value] 
Cuestiones relacionadas