哈希键的Ruby值?

Posted

技术标签:

【中文标题】哈希键的Ruby值?【英文标题】:Ruby value of a hash key? 【发布时间】:2011-06-30 13:45:32 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这个怎么样?

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

您可以使用 [] 运算符访问哈希值

【讨论】:

【参考方案2】:

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

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

您可以使用

访问该值
hash["key1"]

或为

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

或 Ruby 1.9 支持的新格式

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

您可以使用

访问该值
hash[:key1]

【讨论】:

为了使用定义为字符串的键访问符号 2 中的值,我必须这样做:hash[:"#key_var"]【参考方案3】:

看来你的问题可能有点模棱两可。

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

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

您可以通过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 

如果您使用的是 1.9 之前的 Ruby,则可以使用 Hash#index

当有多个具有所需值的键时,该方法将只返回其中一个。如果您希望所有键都具有给定值,则可能需要进行一些迭代:

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 哈希可以使用任何类型的对象作为键(只要它们在用作键时不被修改)) .

【讨论】:

【参考方案4】:

这个问题好像有点模棱两可。

我会尝试对请求的解释。

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”时才执行某些操作。

【讨论】:

【参考方案5】:

我没有清楚地理解你的问题,但我认为这就是你要找的(根据我的理解)

  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"

【讨论】:

【参考方案6】:

作为补充,例如@Intrepidd 的回答是,在某些情况下,您想使用 fetch 而不是 []。为fetch在没有找到key时不抛出异常,给它一个默认值。

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

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

【讨论】:

以上是关于哈希键的Ruby值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中更新哈希键的惯用方法是啥?

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

为啥关键字参数必须作为带有符号键的哈希传递,而不是 Ruby 中的字符串键?

在 Ruby 中找到第一个可能匹配的哈希键的优雅方式

ruby 关于红宝石的冥想哈希与触发器作为键的“dinamic条件”

如何将带有对象作为键的 Ruby 哈希对象作为 Map 对象发送到前端 Javascript