Ruby 合并哈希键值

标签 ruby hash

我有两个散列:一个包含主机列表,另一个包含网络数据。我想创建第三个散列,将主机数据与网络数据结合起来。

这是两个哈希的示例:

{
   :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/

相关文章:

algorithm - 哈希字符串的强大功能并恢复它

python - 散列格子请求正文 Webhook

ruby-on-rails - Rails 调试方法只输出 !binary 值

ruby-on-rails - minitest Controller 测试失败

ruby-on-rails - 当我在搜索中有很多参数时,如何简化条件?

ruby-on-rails - Ruby 在哈希集合中聚合选择性值

java - 无法从 java md5 哈希中获得与 python md5 哈希相同的结果

ruby-on-rails - ruby GraphQL : How to order arguments in an option?

ruby-on-rails - ruby rails : How do I move all files from one folder to another folder?

ruby - 使用 default_proc 初始化所有哈希