web-dev-qa-db-fra.com

Ruby valeur d'une clé de hachage?

J'ai une liste de valeurs qui sont dans un hachage Ruby. Existe-t-il un moyen de vérifier la valeur de la clé et si elle est égale à "X", alors faites "Y"?

Je peux tester pour voir si le hachage a une clé en utilisant hash.has_key?, mais maintenant je dois savoir if hash.key == "X" then...?

29
cswebgrl

Les hachages sont indexés à l'aide des crochets ([]). Tout comme les tableaux. Mais au lieu de l'indexation avec l'index numérique, les hachages sont indexés en utilisant soit le littéral de chaîne que vous avez utilisé pour la clé, soit le symbole. Donc, si votre hachage est similaire à

hash = { "key1" => "value1", "key2" => "value2" }

vous pouvez accéder à la valeur avec

hash["key1"]

ou pour

hash = { :key1 => "value1", :key2 => "value2"}

ou le nouveau format pris en charge dans Ruby 1.9

hash = { key1: "value1", key2: "value2" }

vous pouvez accéder à la valeur avec

hash[:key1]
55
Mircea Grelus

Cette question semble ambiguë.

Je vais essayer avec mon interprétation de la demande.

def do_something(data)
   puts "Found! #{data}"
end

a = { 'x' => 'test', 'y' => 'foo', 'z' => 'bar' }
a.each { |key,value| do_something(value) if key == 'x' }

Cela bouclera sur toutes les paires clé/valeur et ne fera quelque chose que si la clé est "x".

13
nolith

En complément de par ex. @Intrepidd répond, dans certaines situations, vous souhaitez utiliser fetch au lieu de []. Pour que fetch ne lève pas d'exception lorsque la clé n'est pas trouvée, transmettez-lui une valeur par défaut.

puts "ok" if hash.fetch('key', nil) == 'X'

Référence: https://docs.Ruby-lang.org/en/2.3.0/Hash.html .

6
Felix

Que dis-tu de ça?

puts "ok" if hash_variable["key"] == "X"

Vous pouvez accéder aux valeurs de hachage avec l'opérateur []

3
Intrepidd

Il semble que votre question soit peut-être un peu ambiguë.

Si "valeurs" dans la première phrase signifie n'importe quelle valeur générique (c'est-à-dire objet, puisque tout dans Ruby peut être vu comme un objet), alors l'une des autres réponses vous indique probablement ce que vous devez savoir (c'est-à-dire utiliser Hash#[] (par exemple hash[some_key]) pour trouver la valeur associée à une clé).

Si, toutefois, les "valeurs" dans la première phrase sont considérées comme signifiant la partie valeur des "clés, paires de valeurs" (telles qu'elles sont stockées dans des hachages), votre question semble concerner le fait de travailler dans l'autre sens (clé pour une valeur donnée).

Vous pouvez trouver une clé qui mène à une certaine valeur avec Hash#key .

Ruby-1.9.2-head :001 > hash = { :a => '1', :b => :two, :c => 3, 'bee' => :two }
 => {:a=>"1", :b=>:two, :c=>3, "bee"=>:two} 
Ruby-1.9.2-head :002 > a_value = :two
 => :two 
Ruby-1.9.2-head :003 > hash.key(a_value)
 => :b 

Si vous utilisez un Ruby antérieur à 1.9, vous pouvez utiliser Hash#index .

Lorsqu'il existe plusieurs clés avec la valeur souhaitée, la méthode ne renvoie qu'une seule d'entre elles. Si vous voulez toutes les clés avec une valeur donnée, vous devrez peut-être répéter un peu:

Ruby-1.9.2-head :004 > hash[:b] == hash['bee']
 => true 
Ruby-1.9.2-head :005 > keys = hash.inject([]) do # all keys with value a_value
Ruby-1.9.2-head :006 >       |l,kv| kv[1] == a_value ? l << kv[0] : l
Ruby-1.9.2-head :007?>   end
 => [:b, "bee"] 

Une fois que vous avez une clé (les clés) qui mène à la valeur, vous pouvez les comparer et agir sur elles avec if/unless/case expressions, méthodes personnalisées qui prennent des blocs, et cetera. La façon dont vous les comparez dépend du type d'objets que vous utilisez pour les clés (les gens utilisent souvent des chaînes et des symboles, mais Ruby les hachages peuvent utiliser n'importe quel type d'objet comme clés (tant qu'ils sont pas modifiés alors qu'ils servent de clés)).

2
Chris Johnsen

Je n'ai pas bien compris votre problème mais je pense que c'est ce que vous recherchez (selon ma compréhension)

  person =   {"name"=>"BillGates", "company_name"=>"Microsoft", "position"=>"Chairman"}

  person.delete_if {|key, value| key == "name"} #doing something if the key == "something"

  Output: {"company_name"=>"Microsoft", "position"=>"Chairman"}
2
Prabhakar