2017-10-11 64 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