web-dev-qa-db-fra.com

Comment vérifier si une valeur spécifique est présente dans un hachage?

J'utilise Rails et j'ai un objet de hachage. Je veux rechercher le hachage pour une valeur spécifique. Je ne connais pas les clés associées à cette valeur.

Comment vérifier si une valeur spécifique est présente dans un hachage? Aussi, comment trouver la clé associée à cette valeur spécifique?

22
tyronegcarter

Hachage inclut Enumerable , vous pouvez donc utiliser les nombreuses méthodes de ce module pour parcourir le hachage. Il a aussi cette méthode pratique:

hash.has_value?(value_you_seek)

Pour trouver la clé associée à cette valeur:

hash.key(value_you_seek)

Cette documentation API pour Ruby (1.9.2) devrait être utile.

48
rkb
4
Val Akkapeddi

La classe Hash a la méthode select qui renvoie un nouveau hachage d’entrées pour lesquelles le bloc est vrai;

h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| v == 200}  #=> {"b" => 200}

De cette façon, vous effectuerez une recherche par valeur et obtiendrez votre clé!

1
siame

Imaginez que vous ayez la Array suivante de hash

available_sports = [{name:'baseball', label:'MLB Baseball'},{name:'tackle_football', label:'NFL Football'}]

Faire quelque chose comme ça fera l'affaire

available_sports.any? {|h| h['name'] == 'basketball'}

=> false


available_sports.any? {|h| h['name'] == 'tackle_football'}

=> true

1
d1jhoni1b

Le moyen le plus simple de vérifier que plusieurs valeurs sont présentes dans un hachage est le suivant:

h = { a: :b, c: :d }
h.values_at(:a, :c).all? #=> true
h.values_at(:a, :x).all? #=> false

Si vous devez également vérifier les valeurs vides dans Rails avec ActiveSupport:

h.values_at(:a, :c).all?(&:present?)

ou

h.values_at(:a, :c).none?(&:blank?)

La même chose dans Ruby sans ActiveSupport pourrait être fait en passant un bloc:

h.values_at(:a, :c).all? { |i| i && !i.empty? }
1
Anton Orel

Si vous avez hash.values, vous avez maintenant un tableau.

Sur les tableaux, vous pouvez utiliser la méthode de recherche Enumerable include?

hash.values.include?(value_you_seek)
0
Fellow Stranger

Alors que Hash#has_key? fonctionne mais, comme le disait Matz ici , il est déconseillé en faveur de Hash#key?.

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

hash.key?(:some_key)
0
Subhash Chandra