763 votes

Comment vérifier si une clé spécifique est présente ou non dans un hash ?

Je veux vérifier si la clé "user" est présente ou non dans le hash de la session. Comment puis-je le faire ?

Notez que je ne veux pas vérifier si la valeur de la clé est nulle ou non. Je veux simplement vérifier si l'utilisateur clé est présent.

1137voto

sepp2k Points 157757

Hash 's key? vous indique si une clé donnée est présente ou non.

session.key?("user")

0 votes

Agréable : l'accesseur "string" fonctionne aussi pour les objets analysés par JSON.parse :)

3 votes

Cela ne fonctionne pas pour moi, la méthode :user a fonctionné à la place.

344voto

Bozhidar Batsov Points 23298

Alors que Hash#has_key? fait le travail, comme le note Matz ici il a été déprécié au profit de Hash#key? .

hash.key?(some_key)

1 votes

Belle référence à cette demande de changement et à la réponse ultérieure de Matz.

1 votes

Est-ce que quelqu'un en est sûr ?

56voto

Installero Points 2044

Dans les dernières versions de Ruby, l'instance de hachage a une valeur key? méthode :

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

Veillez à utiliser la clé de symbole ou la clé de chaîne en fonction de ce que vous avez dans votre hachage :

{'a' => 2}.key?(:a)
=> false

3 votes

Il existe apparemment depuis la version 1.6 de Ruby : ruby-doc.com/docs/ProgrammingRuby/html/ (peut-être plus tôt, je ne sais pas où vérifier les documents)

37voto

G.B Points 767

Il est très tard, mais il est préférable d'utiliser des symboles comme clé :

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 

Mais lors de la création d'un hash, si vous passez une chaîne de caractères comme clé, il cherchera la chaîne dans les clés.

Mais lorsque vous créez un hash, vous passez un symbole comme clé, alors has_key ? recherchera les clés en utilisant le symbole.


Si vous utilisez Rails, vous pouvez utiliser Hash#with_indifferent_access pour éviter cela ; les deux hash[:my_key] et hash["my_key"] pointera vers le même enregistrement

7 votes

Si vous utilisez Rails, vous pouvez utiliser Hash#with_indifferent_access pour éviter cela ; les deux :my_key et "my_key" pointera vers le même enregistrement

0 votes

C'est la meilleure réponse, surtout lorsque vous recherchez une clé provenant d'une variable, par exemple, my_hash.has_key? my_key.to_sym :)

9voto

Arvind singh Points 932

Un autre moyen est ici

hash = {one: 1, two: 2}

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

hash.member?(:five)
#=> false

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X