我有两个散列:一个包含主机列表,另一个包含网络数据。我想创建第三个散列,将主机数据与网络数据结合起来。
这是两个哈希的示例:
{
:myhost1=>{:name=>"hostname1", :trust=>:net80, :dmz=>:net81},
:myhost2=>{:name=>"anotherhost", :trust=>:net80, :dmz=>:net82}
}
{
:net80=>{:range=>"192.168.0.0", :gateway=>"192.168.0.1", :netmask=>"255.255.255.0"},
:net81=>{:range=>"192.168.1.0", :gateway=>"192.168.1.1", :netmask=>"255.255.255.0"},
:net82=>{:range=>"192.168.3.0", :gateway=>"192.168.2.1", :netmask=>"255.255.248.0"}
}
合并将与 trust 和 dmz - 将主机信息中的 key 替换为网络信息中关联 key 的值。合并的散列将是这样的:
{
:myhost1=>{:name=>"hostname1", :trust=>{:range=>"192.168.0.0", :gateway=>"192.168.0.1", :netmask=>"255.255.255.0"}, :dmz=>{:range=>"192.168.1.0", :gateway=>"192.168.1.1", :netmask=>"255.255.255.0"}},
:myhost2=>{:name=>"anotherhost", :trust=>{:range=>"192.168.0.0", :gateway=>"192.168.0.1", :netmask=>"255.255.255.0"}, :dmz=>{:range=>"192.168.3.0", :gateway=>"192.168.2.1", :netmask=>"255.255.248.0"}}
}
编辑:我更新了主机哈希以使用符号来简化合并。
最佳答案
hosts = {
:myhost1=>{ :name=>"hostname1", :trust=>:net80, :dmz=>:net81 },
:myhost2=>{ :name=>"anotherhost", :trust=>:net80, :dmz=>:net82 }
}
network = {
:net80=>{ :range=>"192.168.0.0", :gateway=>"192.168.0.1",
:netmask=>"255.255.255.0" },
:net81=>{ :range=>"192.168.1.0", :gateway=>"192.168.1.1",
:netmask=>"255.255.255.0" },
:net82=>{ :range=>"192.168.3.0", :gateway=>"192.168.2.1",
:netmask=>"255.255.248.0" }
}
这里有两种可以使用的方法。
#1 将散列与其自身合并,改变一些值
hosts.merge(hosts) { |*,g|
g.merge(trust: network[g[:trust]], dmz: network[g[:dmz]]) }
#=> {
# :myhost1=>{
# :name =>"hostname1",
# :trust=>{ :range=>"192.168.0.0", :gateway=>"192.168.0.1",
# :netmask=>"255.255.255.0" },
# :dmz =>{ :range=>"192.168.1.0", :gateway=>"192.168.1.1",
# :netmask=>"255.255.255.0" }
# },
# :myhost2=>{
# :name =>"anotherhost",
# :trust=>{ :range=>"192.168.0.0", :gateway=>"192.168.0.1",
# :netmask=>"255.255.255.0" },
# :dmz =>{ :range=>"192.168.3.0", :gateway=>"192.168.2.1",
# :netmask=>"255.255.248.0" }
# }
# }
#2 构建哈希
hosts.each_with_object({}) { |(host,g), h|
h[host] = { :name =>g[:name],
:trust=>network[g[:trust]],
:dmz =>network[g[:dmz]] } }
#=> same as for #1
关于Ruby 合并哈希键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516856/