合并哈希,不要覆盖里面的列表

时间:2013-03-02 10:01:45

标签: ruby-on-rails ruby

在Ruby中,我们可以使用merge函数合并哈希:

1.9.3-p194 :038 > h1 = { "a" => 1, "b" => [1] }
 => {"a"=>1, "b"=>[1]} 
1.9.3-p194 :039 > h2 = { "a" => 2, "b" => [2] }
 => {"a"=>2, "b"=>[2]} 
1.9.3-p194 :040 > h1.merge(h2)
 => {"a"=>2, "b"=>[2]} 

合并会覆盖哈希中的数组,但我希望它能加入它们。

 => {"a"=>2, "b"=>[1, 2]}

是否有红宝石功能或单线程来完成此任务?

2 个答案:

答案 0 :(得分:9)

您可以为合并方法添加额外的行为

h1 = { "a" => 1, "b" => [1] }
h2 = { "a" => 2, "b" => [2] }

h1.merge(h2) {|key, first, second| first.is_a?(Array) && second.is_a?(Array) ? first | second : second }

答案 1 :(得分:0)

你可以将一个块传递给merge,看起来它是专门为这种情况设计的。

a = { x: 1, y: [1] }
b = { x: 2, y: [2] }
a.merge(b) {|k, a, b| a.is_a?(Array) && b.is_a?(Array) ? a + b : b}
=> { x: 2, y: [1, 2] }