如何在哈希数组中搜索包含某个键值对的哈希的名称? (红宝石)

时间:2013-06-17 13:59:47

标签: ruby hash

我有这样的事情:

array = [
  hash1 = {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
  hash2 = {"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
  hash3 = {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]

在任何给定时间,只有一个oniontrue

我希望表达式或函数返回变量的名称(即hash1hash2),其中包含onion当前为true的哈希值。我怎么能这样做?

4 个答案:

答案 0 :(得分:5)

这是不可能的。对象不知道引用它的变量。

答案 1 :(得分:1)

使用哈希替换数组并生成:hash1:hash2:hash3键可以实现类似的效果。

假设我们有hash变量:

hash.keys.select{|key| hash[key]['onion']}

答案 2 :(得分:0)

但如果您通过允许冒号:而不是=符号来放宽要求:

array = [
  hash1: {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
  hash2: {"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
  hash3: {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]

我们可以解决这个问题:

-> *_, **p { p.find { |_, v| v["onion"] }.first }.( *array )

答案 3 :(得分:-1)

好的,正如你在 @JörgWMittag 所做的帖子的评论部分中提到的那样 - 有没有办法从洋葱为真的数组中的哈希返回某个键(虽然不是洋葱的关键?。是的,有可能如下所示:

在这里,我考虑了一个输入数组,其中存在多个Hash,其中洋葱键的值为true。现在要处理这种情况{}需要enum#find_all

array = [
  {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
 {"darco"=>"johnson", "girth"=>"wide", "onion"=>true},
  {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]

array.find_all{|i| i["onion"]== true}.map{|i| i.keys[0]}
#>>["marco", "darco"]

根据 OP 的输入数组,enum#find可以正常工作。

array = [
  {"marco"=>"polo", "girth"=>"skinny", "onion"=>true},
 {"darco"=>"johnson", "girth"=>"wide", "onion"=>false},
  {"flarco"=>"kiwi", "birth"=>"noble", "onion"=>false}
]

array.find{|i| i["onion"] }.keys[0]
# => "marco"