如何在ruby中的另一个哈希中替换哈希键值

时间:2015-03-13 04:56:26

标签: ruby hash

我有两个哈希数组:

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}]

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}]