2014-07-24 66 views
0

我有兩個散列:合併兩個哈希有交替的紅寶石(爲2.xx)

h1 = {'a' => 33, 'b' => 4, 'c' => 6} 
h2 = {'d' => 10, 'e' => 1, 'f' => 12} 

現在他們應該合併爲一個,與交替,所以最終的哈希應該是這樣的:

{'a' => 33, 'd' => 10, 'b' => 4, 'e' = 1, 'c' => 6, 'f' => 12} 

這樣做的最好方法是什麼。大概是一個單一的班輪?

謝謝!

+1

排序的邏輯是什麼? –

+0

邏輯是:先從第一個散列開始,然後從第二個散列開始;然後從第一個散列第二個,第二個從第二個散列。等等,只是他們已經在h1和h2 –

+1

順序他們已經是一個接一個我認爲@ArupRakshit意味着爲什麼他們需要按照特定的順序,因爲你可以通過密鑰訪問任何東西,而不知道它在什麼位置。 –

回答

3

這裏是我的嘗試

Hash[*[h1.to_a, h2.to_a].transpose.flatten] 
# => {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12} 
# or 
Hash[*h1.to_a.zip(h2.to_a).flatten] 
# => {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12} 

即使多顆。 :-)

Hash[*[*h1, *h2].transpose.flatten] 
# => {"a"=>"b", "c"=>"d", "e"=>"f", 33=>4, 6=>10, 1=>12} 
3

沒有星星!

h1 = {'a' => 33, 'b' => 4, 'c' => 6} 
h2 = {'d' => 10, 'e' => 1, 'f' => 12} 

h1.to_a.zip(h2.to_a).flatten(1).to_h 
    #=> {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12} 

對於Ruby版本< 2.0:

Hash[h1.to_a.zip(h2.to_a).flatten(1)] 

Array#transposeEnumerable#zip操作數組時總是可互換的。

對於Ruby版本< 1.9,沒有指定散列中的鍵/值對的排序。對於這些版本,最接近你能來回答你的問題是提供鍵的期望排序:

keys_in_order = ['a', 'd', 'b', 'e', 'c', 'f'] 

檢索相關的值:

values = h1.merge(h2).values_at(*keys_in_order) 
    #=> [33, 10, 4, 1, 6, 12] 

和配對這些與zip

keys_in_order.zip(values) 
    #=> [["a", 33], ["d", 10], ["b", 4], ["e", 1], ["c", 6], ["f", 12]] 
+0

'flatten'需要參數..我忘了:-(感謝幫助記住它。 –