我有两个哈希数组:
a = [{"a" => 1}, {"b" => [10, 9, 11]}, {"c" => [8, 9]}, {"d" => [7, 1, 1]}]
b = [{"k" => 1}, {"l" => "c"}, {"m" => "a"}, {"n" => "b"}, {"o" => 2}]
如果b
中的哈希值包含的值是a
中某个哈希值中的一个键,我想将该值替换为a
中相应键的值。例如,在{"l"=>"c"}
中的b
中,值"c"
是{"c" => [8, 9]}
中a
中的关键,因此我希望替换值"c"
在{"l" => "c"}
中使用数组[8,9]
。另一方面,1
中{"k" => 1}
中的值b
不是a
中任何哈希值的关键字,因此保持不变。
我希望结果如下:
result #=> [{"k" => 1}, {"l" => [8, 9]}, {"m" => 1},
# {"n" => [10, 9, 11]}, {o => 2}]
答案 0 :(得分:3)
您可以使用a
合并所有元素来创建哈希。
hsh = a.inject(:merge)
# => {"a"=>1, "b"=>[10, 9, 11], "c"=>[8, 9], "d"=>[7, 1, 1]}
然后在b
上调用地图,就像在Cary的解决方案中一样。
b.map do |h|
k,v = h.to_a.first
{ k => hsh.key?(v) ? hsh[v] : v }
end
# => [{"k"=>1}, {"l"=>[8, 9]}, {"m"=>1}, {"n"=>[10, 9, 11]}, {"o"=>2}]
答案 1 :(得分:0)
这应该达到你的目标:
a = [{"a"=>1},{"b"=>[10,9,11]},{"c"=>[8,9]},{"d"=>[7,1,1]}]
b = [{"k"=>1},{"l"=>"c"},{"m"=>"a"},{"n"=>"b"},{"o"=>2}]
h = a.each_with_object({}) { |g,h| h[g.keys.first] = g.values.first }
#=> {"a"=>1, "b"=>[10, 9, 11], ["c1", "c2", "c3"]=>[8, 9], ["d1"]=>[7, 1, 1]}
b.map do |g|
k,v = g.to_a.first
{ k => h.key?(v) ? h[v] : v }
end
#=> [{"k"=>1}, {"l"=>[8, 9]}, {"m"=>1}, {"n"=>[10, 9, 11]}, {"o"=>2}]