Ruby合并哈希将密钥放入csv字符串

有没有一种聪明的方法可以在Ruby中实现以下function?

hash1 = { "a" => 1, "b" => 2, "d" => 3} hash2 = { "a" => 4, "b" => 5, "c" => 7} hash3 = { "a" => 4, "d" => 7, "e" => 9} puts hash1.csvMerge(hash2).csvMerge(hash3) 

输出为:

 { "a" => "1,4,4", "b" => "2,5,0", "c" => "0,7,0", "d" => "3,0,7", "e" => "0,0,9" } 

我要做的是将一堆Ruby哈希值合并到一个哈希中,在实践中我有十几个哈希哈希,其值被组合成逗号分隔的字符串。

 hashes = [hash1, hash2, hash3] keys = hashes.inject({}){|hh, h| hh = hh.merge(h); hh}.keys # the set of all keys # default_hash = keys.inject({}){|d, k| d[k] = 0; d} # hash with value 0 for all keys # complemented_hashes = hashes.map{|h| default_hash.merge(h)} # missing values filled in # p Hash[complemented_hashes.map{|h| h.to_a}.flatten(1).group_by{|k, v| k}. map{|k, v| [k, v.map{|k, v| v}.join(",")]}] 
 hash1.merge(hash2){|key, oldval, newval| [oldval,newval].join(",")} => {"a"=>"1,4", "b"=>"2,5", "d"=>3, "c"=>7} 

我不知道这是否有性能问题

 hashes = [hash1, hash2, hash3] hash_with_all_keys = {} hashes.each{|hash| hash_with_all_keys.merge!(hash)} keys = hash_with_all_keys.keys result_hash_mapping = keys.map do |key| value = hashes.map{|hash| hash[key].to_i}.join(",") [key, value] end result_hash = Hash[result_hash_mapping] 

我可以使用keys = hashes.inject({}){|merge_hash, hash| merge_hash.merge(hash)}.keys替换第2行到第4行 keys = hashes.inject({}){|merge_hash, hash| merge_hash.merge(hash)}.keys但我觉得很难读。

 hash1 = { "a" => 1, "b" => 2, "d" => 3} hash2 = { "a" => 4, "b" => 5, "c" => 7} hash3 = { "a" => 4, "d" => 7, "e" => 9} hashes = [hash1, hash2, hash3] hashes.each{|h| h.each{|k,v| h[k] = v.to_s }} res = hashes.inject{|m,h| m.merge(h){|k,old,new| "#{old},#{new}" }} #merge and glue p res #=> {"a"=>"1,4,4", "b"=>"2,5", "d"=>"3,7", "c"=>"7", "e"=>"9"} 

function方法:

 hashes = [hash1, hash2, hash3] result = Hash[hashes.flat_map(&:keys).uniq.map do |key| [key, hashes.map { |h| h[key] || 0 }.join(",")] end] #=> {"a"=>"1,4,4", "b"=>"2,5,0", "c"=>"0,7,0", "d"=>"3,0,7", "e"=>"0,0,9"}