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?
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.
Hash.has_value? et Hash.key .
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é!
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
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? }
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)
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)