我正在尝试对红宝石哈希进行查询,它非常类似于:
{"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_value
和new_value
是一样的。|*, new_value|
中的星号是除最后一个块变量之外的所有变量的占位符。