在一个json文件中合并来自数组的两个或多个哈希值

时间:2018-02-20 16:24:55

标签: ruby

我遇到的问题是当我尝试为引导虚拟机自动化一个terraform脚本时。我将所有模板保存在json文件中,根据实例,它将采用一个,两个或更多模板来创建节点json文件。 我的代码如下:

template.each do |t|
  node = JSON.parse(File.read("./terraform/node/#{t}.json"))
  atr << node.each { |k, v| puts "#{k}: #{v}" }
  concatenated = atr.flatten
  temp = concatenated  
  File.open("./terraform/node/#{instance_name}.json","w") do |f|
    f.puts JSON.pretty_generate(temp)
  end
end

输出文件如下所示:

[{"haproxy"=>{"app_server_role"=>["s1", "s2"]}}, {"apache"=>{"listen_ports"=>["80", "443"]}}, {"tags"=>[]}]

问题是在数组中我们有精确的模板存储在erb:

{"haproxy"=>{"app_server_role"=>["s1", "s2"]}}
{"tags"=>[]} ...

我想要的是一个有效的json,其中包含以下模板的内容:

 {"haproxy"=>{"app_server_role"=>["s1", "s2"]}, "apache"=>{"listen_ports"=>["80", "443"]}, {"tags"=>[]}

1 个答案:

答案 0 :(得分:1)

output_file = [{"haproxy"=>{"app_server_role"=>["s1", "s2"]}}, {"apache"=>{"listen_ports"=>["80", "443"]}}, {"tags"=>[]}]

output_file.each_with_object({}) { |h, h2| h2.merge!(h) }
 => {"haproxy"=>{"app_server_role"=>["s1", "s2"]}, "apache"=>{"listen_ports"=>["80", "443"]}, "tags"=>[]}

mudasobwa提出的另一个很好的选择:

output_file.reduce(&:merge)