Ruby on rails 通过合并两个哈希来形成新的哈希结构
我有两个格式相同的散列。我的目标是通过从两个散列中获取值,更改第一个散列中的键来创建一个新的散列。我已经在下面的目标中解释了我想要的输出。我不能从这里往前走,请帮忙 我拥有的Ruby on rails 通过合并两个哈希来形成新的哈希结构,ruby-on-rails,ruby,arrays,data-structures,hash,Ruby On Rails,Ruby,Arrays,Data Structures,Hash,我有两个格式相同的散列。我的目标是通过从两个散列中获取值,更改第一个散列中的键来创建一个新的散列。我已经在下面的目标中解释了我想要的输出。我不能从这里往前走,请帮忙 我拥有的 h1 = { "x"=> { "imp"=> {"a"=>1, "b"=>2}, "ctr"=> {"a"=>3, "b"=>4} }, "y"=> { "imp"=> {"c"=>1, "d"=>2}, "ctr"=> {"c
h1 = {
"x"=> {
"imp"=> {"a"=>1, "b"=>2},
"ctr"=> {"a"=>3, "b"=>4}
},
"y"=> {
"imp"=> {"c"=>1, "d"=>2},
"ctr"=> {"c"=>3, "d"=>4}
},
"z"=> {
"imp"=> {"e"=>10, "f"=>20, "g"=> 111},
"ctr"=> {"e"=>30, "f"=>40, "g"=> 222}
}
}
h2 = {
"x"=> {
"imp"=>{"a"=>11, "b"=>22},
"ctr"=>{"a"=>33, "b"=>44}
},
"y"=> {
"imp"=> {"c"=>11, "d"=>22},
"ctr"=>{"c"=>33, "d"=>44}
},
"z"=> {
"imp"=>{"e"=>11, "f"=>22, "g"=> 333},
"ctr"=>{"e"=>55, "f"=>66, "g"=> 444}
}
}
我的目标
{segment=>"x=a", "imp"=>1, "ctr"=>3, "imp_of_h2"=>11, "ctr_of_h2"=>33},
{segment=>"x=b", "imp"=>2, "ctr"=>4, "imp_of_h2"=>22, "ctr_of_h2"=>44},
{segment=>"y=c", "imp"=>1, "ctr"=>3, "imp_of_h2"=>11, "ctr_of_h2"=>33},
{segment=>"y=d", "imp"=>2, "ctr"=>4, "imp_of_h2"=>22, "ctr_of_h2"=>44},
{segment=>"z=e", "imp"=>10, "ctr"=>4, "imp_of_h2"=>22, "ctr_of_h2"=>55},
{segment=>"z=f", "imp"=>20, "ctr"=>40, "imp_of_h2"=>22, "ctr_of_h2"=>66},
{segment=>"z=g", "imp"=>111, "ctr"=>222, "imp_of_h2"=>333, "ctr_of_h2"=>444}
我到目前为止尝试的内容。但它只对一个哈希函数起作用。我需要为两个哈希实现这一点
data_final = []
h1.flat_map do |segment, attrs|
segments = attrs.values.flat_map(&:keys).uniq
# create a segment entry for each unique letter
segments.map do |seg|
row = {"segment" => "#{segment}=#{seg}"}
row.merge! Hash[attrs.keys.map {|key| [key,attrs[key][seg]]}]
data_final << row
end
end
data\u final=[]
h1.平面图do段,属性|
segments=attrs.values.flat_映射(&:keys).uniq
#为每个唯一的字母创建段条目
segments.map do| seg|
行={“段”=>“#{segment}=#{seg}”
行,合并!Hash[attrs.keys.map{| key |[key,attrs[key][seg]}]
实际上,这是你想要的吗?(不要忘记为Array#>
方法安装y\u支持
gem。)
这些甚至都不是有效的散列…那么,这个转换的具体规则是什么?写下来。规则是创建一个条目“段”,其值是示例中的第一个键“x”,添加“=”,然后从内部选择字母,说“a”,然后陈述其相应的关联,如imps=>value,ctr=>value等。从输出中,它更清晰,那么,实现这个逻辑有什么问题吗?你能@SergioTulentsev看到我是如何尝试的吗?从这个问题来看,我可以对其中一个哈希进行操作,但我一直在尝试添加第二个哈希的属性,你能帮我吗?
require 'y_support/core_ext' # gem install y_support if necessary
labels = "imp", "ctr"
h2_suffix = "_of_h2"
result = [ [?x, ?a], [?x, ?b], [?y, ?c], [?y, ?d], [?z, ?e], [?z, ?f], [?z, ?g] ].map do
|coordinate, letter|
[ "segment", *labels, *labels.map { |lbl| lbl + h2_suffix } ] >>
[ "#{coordinate}=#{letter}",
*labels.map { |label| h1[coordinate][label][letter] },
*labels.map { |label| h2[coordinate][label][letter] } ]
end