从给定值构造新哈希

我似乎失去了试图实现以下,我整天试着请帮助

我有

h = { "kv1001"=> { "impressions"=>{"b"=>0.245, "a"=>0.754}, "visitors" =>{"b"=>0.288, "a"=>0.711}, "ctr" =>{"b"=>0.003, "a"=>0.003}, "inScreen"=>{"b"=>3.95, "a"=>5.031} }, "kv1002"=> { "impressions"=>{"c"=>0.930, "d"=>0.035, "a"=>0.004, "b"=>0.019,"e"=>0.010}, "visitors"=>{"c"=>0.905, "d"=>0.048, "a"=>0.005, "b"=>0.026, "e"=>0.013}, "ctr"=>{"c"=>0.003, "d"=>0.006, "a"=>0.004, "b"=>0.003, "e"=>0.005}, "inScreen"=>{"c"=>4.731, "d"=>4.691, "a"=>5.533, "b"=>6.025, "e"=>5.546} } } 

我的目标

 { "segment"=>"kv1001=a", "impressions"=>"0.754", "visitors"=>"0.711", "inScreen"=>"5.031", "ctr"=>"0.003" }, { "segment"=>"kv1001=b", "impressions"=>"0.245", "visitors"=>"0.288", "inScreen"=>"3.95", "ctr"=>"0.003" }, { "segment"=>"kv1002=a", "impressions"=>"0.004" #... etc } 

我的目标是创建一个带有’kv1001 = a’的散列,即散列内的字母,并分配印象,访问者等密钥。示例MY GOAL具有格式所以格式类型“kv1001 = a”必须从散列构造本身,a是散列内的字母。

我现在解决了这个问题

 `data_final = [] h.each do |group,val| a = Array.new(26){{}} val.values.each_with_index do |v, i| keys = val.keys segment_count = v.keys.length (0..segment_count-1).each do |n| a0 = {"segment" => "#{group}=#{v.to_a[n][0]}", keys[i] => v.to_a[n][1]} a[n].merge! a0 if a[n].count > 4 data_final << a[n] end end end end` 

这是一个更简单的版本

 h.flat_map do |segment, attrs| letters = attrs.values.flat_map(&:keys).uniq # create a segment entry for each unique letter letters.map do |letter| seg = {"segment" => "#{segment}=#{letter}"} seg.merge Hash[attrs.keys.map {|key| [key,attrs[key][letter]]}] end end 

输出:

 [{"segment"=>"kv1001=b", "impressions"=>0.245, "visitors"=>0.288, "ctr"=>0.003, "inScreen"=>3.95}, {"segment"=>"kv1001=a", "impressions"=>0.754, "visitors"=>0.711, "ctr"=>0.003, "inScreen"=>5.031}, {"segment"=>"kv1002=c", "impressions"=>0.93, "visitors"=>0.905, "ctr"=>0.003, "inScreen"=>4.731}, {"segment"=>"kv1002=d", "impressions"=>0.035, "visitors"=>0.048, "ctr"=>0.006, "inScreen"=>4.691}, {"segment"=>"kv1002=a", "impressions"=>0.004, "visitors"=>0.005, "ctr"=>0.004, "inScreen"=>5.533}, {"segment"=>"kv1002=b", "impressions"=>0.019, "visitors"=>0.026, "ctr"=>0.003, "inScreen"=>6.025}, {"segment"=>"kv1002=e", "impressions"=>0.01, "visitors"=>0.013, "ctr"=>0.005, "inScreen"=>5.546}]