如何对哈希执行查询,并获得另一个哈希结果



我正在尝试对红宝石哈希进行查询,它非常类似于:

{"client1" => {"tag" => "13", "host" => "client1.example.com", ...}, "client2" => {"tag" => "11", ...} }

我想仅将其映射到带有标签的客户端名称,如下所示:

{"client1" => "13", "client2" => "11"}

我一直在努力解决.each和.select和.find的问题,但还没有弄清楚。我很确定这并不难,有人知道吗?谢谢

你可以做同样的事情,

如下所示
data = {
  "client1" => {"tag" => "13", "host" => "client1.example.com"}, 
  "client2" => {"tag" => "11"} 
}
desired_data = Hash.new
data.each do |k,v|
  desired_data[k] = v["tag"]
end

desired_data将包含您的结果。

正如@sawa所建议的,您也可以使用

data.each_with_object({}){|(k, v), h| h[k] = v["tag"]}

使用 map

test_hash = {"client1" => {"tag" => "13", "host" => "client1.example.com"}, "client2" => {"tag" => "11"} }
test_hash.map{|k,v| [k, v['tag']]}.to_h
#=> {"client1"=>"13", "client2"=>"11"}

一种方法是将哈希与自身合并,使用 Hash#merge 的形式,该形式使用块来确定正在合并的两个哈希中存在的键的值,在本例中是所有键。

h = {"client1" => {"tag" => "13", "host" => "client1.example.com"},
     "client2" => {"tag" => "11"} }
h.merge(h) { |*,v| v["tag"] }
  #=> {"client1"=>"13", "client2"=>"11"}

如文档中所述,块有三个变量,通常写|key, old_value, new_value| 。在这里,old_valuenew_value是一样的。|*, new_value| 中的星号是除最后一个块变量之外的所有变量的占位符。

最新更新