如何搜索哈希数组的名称的哈希包含一个特定的键值对?(Ruby)



我有这样的东西:

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

,其中一个且只有一个onion在任何给定时间是true

我想要一个表达式或函数来返回变量的名称(即hash1, hash2),该变量持有onion当前为true的哈希值。我该怎么做呢?

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

也可以通过将数组替换为哈希并制作:hash1:hash2:hash3键来实现类似的效果。

假设我们有hash变量:

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

但是如果您稍微放宽要求,允许冒号:代替=符号:

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 )

好吧,正如你在@Jörg W Mittag - 的评论部分所问的那样,是否有一种方法可以从数组的哈希中返回一个特定的键,其洋葱是真的(不是洋葱的键,虽然)?。是的,这是可能的,正如我下面所示:

这里我考虑了一个输入数组,其中存在多个Hash,它们具有键oniontrue值。现在需要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"

最新更新