2017-10-11 47 views
0

我有两个哈希看起来像这样:连接两个红宝石哈希通过按键

h1 = {key1: 'Roses are', key2: 'Violets are'} 
h2 = {key1: 'Red', key2: 'Blue'} 

我想通过键加入他们的行列,让我得到这样一个哈希:

result = {'Roses are' => 'Red', 'Violets are' => 'Blue'} 

我有一些代码,做的伎俩:

result = {} 
h1.each { |key, value| result[value] = h2[key] } 

我不知道是否有在标准库的方法来做到这一点,还是这个可以用更少的做代码。

+0

更少的代码?这只有2行。如果你真的需要,你可以使用each_with_object将它减少到一行,如:'result = h1.each_with_object({}){|(key,value),h3 | h3 [value] = h2 [key]}' – Santhosh

回答

5

你想要一个1:1的映射,所以map将工作:

h1.map { |k, v| ... } 

h1值将成为新的键:

h1.map { |k, v| [v, ...] } 

h2的相应值成为新值:

h1.map { |k, v| [v, h2[k]] } 
#=> [["Roses are", "Red"], ["Violets are", "Blue"]] 

而且to_h转换,早成散列:

h1.map { |k, v| [v, h2[k]] }.to_h 
#=> {"Roses are"=>"Red", "Violets are"=>"Blue"} 
1

邮编值:

h1 = {key1: 'Roses are', key2: 'Violets are'} 
h2 = {key1: 'Red', key2: 'Blue'} 
result = h1.values.zip(h2.values).to_h 
+4

谢谢,但是当我改变第二个散列的顺序时,它不起作用,例如:h2 = {key2:'Blue',key1:'Red'}。 – msayen

+0

@msayen'h1.values.zip(h2.values_at(* h1.keys))。to_h'会解决这个问题。 ['values_at'](http://ruby-doc.org/core-2.4.2/Hash.html#method-i-values_at)获取给定键的值(按照该顺序)。也许你应该相应地改变你的示例代码,这样我们就不会做出错误的假设。 – Stefan