散列键的Ruby值?

时间:2011-02-20 00:03:08

标签: ruby hashmap

我有一个Ruby哈希值的列表。有没有办法检查密钥的值,如果它等于“X”,那么做“Y”?

我可以使用hash.has_key?测试哈希是否有密钥,但现在我需要知道if hash.key == "X" then...

6 个答案:

答案 0 :(得分:54)

使用方括号([])对哈希进行索引。就像数组一样。但是,不是使用数字索引进行索引,而是使用您用于键的字符串文字或符号来对哈希进行索引。 所以如果你的哈希类似于

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

您可以使用

访问该值
hash["key1"]

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

或Ruby 1.9支持的新格式

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

您可以使用

访问该值
hash[:key1]

答案 1 :(得分:13)

这个问题似乎含糊不清。

我会尝试解释我的请求。

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' }

这将遍历所有键值对,并仅在键为“x”时执行某些操作。

答案 2 :(得分:5)

作为例如@Intrepidd的回答,在某些情况下你想使用fetch而不是[]。要使fetch在找不到密钥时不抛出异常,请将其传递给默认值。

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

参考:https://docs.ruby-lang.org/en/2.3.0/Hash.html

答案 3 :(得分:3)

这个怎么样?

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

您可以使用[]运算符

访问哈希值

答案 4 :(得分:2)

看来你的问题可能有些含糊不清。

如果第一句中的“值”表示任何通用值(即对象,因为Ruby中的所有内容都可以被视为对象),那么其他一个答案可能会告诉您需要知道的内容(即使用{{ 3}}(例如hash[some_key])找到与键相关联的值。

但是,如果第一句中的“值”表示“键,值对”的值部分(存储在哈希中),那么您的问题似乎可能是关于在另一个方向上工作(给定值的键)。

您可以使用Hash#[]找到导致某个值的 键。

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 

如果您使用的是早于1.9的Ruby,则可以使用Hash#key

如果有多个具有所需值的键,则该方法仅返回其中一个键。如果你想要所有具有给定值的键,你可能需要迭代一下:

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"] 

一旦你有一个导致该值的键(键),你可以比较它们并用if/unless/case表达式,带有块的自定义方法等来对它们进行操作。你如何比较它们取决于你用于键的对象的类型(人们经常使用字符串和符号,但Ruby哈希可以使用任何类型的对象作为键(只要它们在作为键时不被修改))

答案 5 :(得分:2)

我没有清楚地理解你的问题,但我认为这正是你所寻找的(基于我的理解)

  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"}