¿Cómo verificar si una clave específica está presente en un hash o no?

636

Quiero comprobar si la clave "usuario" está presente o no en el hash de la sesión. ¿Cómo puedo hacer esto?

Tenga en cuenta que no quiero verificar si el valor de la clave es nulo o no. Solo quiero verificar si la clave "usuario" está presente.

Mohit Jain
fuente

Respuestas:

952

HashEl key?método le dice si una clave dada está presente o no.

session.key?("user")
sepp2k
fuente
agradable: el descriptor de acceso "string" también funciona para JSON. Analizar objetos analizados :)
Bijan
2
Esto no funciona para mí, el método de usuario funcionó en su lugar
Akash Agarwal
295

Mientras Hash#has_key?hace el trabajo, como Matz señala aquí , ha quedado en desuso a favor Hash#key?.

hash.key?(some_key)
Bozhidar Batsov
fuente
1
Buena referencia a esa solicitud de cambio y la respuesta posterior de Matz.
Joshua Pinter
¿Alguien lo sabe con seguridad?
codeforester
41

En las últimas versiones de Ruby, la instancia de Hash tiene un key?método:

{a: 1}.key?(:a)
=> true

Asegúrese de usar la tecla de símbolo o una tecla de cadena dependiendo de lo que tenga en su hash:

{'a' => 2}.key?(:a)
=> false
installero
fuente
2
Aparentemente existía ya en Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/… (quizás antes, no sé dónde verificarlo documentado)
Beni Cherniavsky-Paskin
28

Es muy tarde, pero preferiblemente los símbolos deben usarse como clave:

my_hash = {}
my_hash[:my_key] = 'value'

my_hash.has_key?("my_key")
 => false 
my_hash.has_key?("my_key".to_sym)
 => true 

my_hash2 = {}
my_hash2['my_key'] = 'value'

my_hash2.has_key?("my_key")
 => true 
my_hash2.has_key?("my_key".to_sym)
 => false 

Pero al crear hash si pasa una cadena como clave, entonces buscará la cadena en las claves.

Pero cuando creas hash, pasas el símbolo como clave y luego has_key? buscará las teclas usando el símbolo.


Si está utilizando Rails, puede usar Hash#with_indifferent_accesspara evitar esto; ambos hash[:my_key]y hash["my_key"]apuntarán al mismo registro

GB
fuente
66
Si está utilizando Rails, puede usar Hash#with_indifferent_accesspara evitar esto; ambos :my_keyy "my_key"señalarán el mismo récord
Devon Parsons
5

Siempre puedes usar Hash#key? para verificar si la clave está presente en un hash o no.

Si no, te devolverá false

hash =  { one: 1, two:2 }

hash.key?(:one)
#=> true

hash.key?(:four)
#=> false
Deepak Mahakale
fuente
3

Otra forma es aquí

hash = {one: 1, two: 2}

hash.member?(:one)
#=> true

hash.member?(:five)
#=> false
Arvind Singh
fuente
0

En Rails 5, ¿has_key? El método verifica si la clave existe en el hash. La sintaxis para usarlo es:

YourHash.has_key? :yourkey
BinaryMan
fuente