2016-04-14 45 views
-1

什麼是交換h1鍵與h2值的最短途徑:與HASH2交換HASH1鍵的值

h1 = {a: 1, b:2, c:3} 
h2 = {a: 'a1', b: 'b1'} 

這是我想要的交換後有結果:

h1 = {a1: 1, b1: 2, c:3} 
+1

'h2'中的值是'String's,結果中的鍵是'Symbol's,所以你不只是用'h2'的值交換'h1'的鍵,還要轉換它們正在進行中。 –

回答

2
h1 = {a: 1, b:2, c:3} 
h2 = {a: 'a1', b: 'b1'} 

Hash[h1.map { |k, v| [(h2[k] || k).to_sym ,v] }] 
# returns {:a1=>1, :b1=>2, :c=>3} 

您也可以使用.to_h而不是Hash[]

h1.map { |k, v| [(h2[k] || k).to_sym ,v] }.to_h 
# returns {:a1=>1, :b1=>2, :c=>3} 
0
h1 = {a: 1, b:2, c:3} 
h2 = {a: 'a1', b: 'b1'} 
h1 = h1.inject({}){ |h, (k, v)| h2.has_key?(k) ? h[h2[k].to_sym] = v : h[k] = v; h } 
#=> {:a1=>1, :b1=>2, :c=>3} 
3

什麼:

h1 = h1.map{|key, val| [h2.fetch(key,key).to_sym, val]}.to_h 
+0

'to_h'在ruby 2中不適用於'Array' – tokhi

+0

如果我沒有記錯的話,它被添加到了2.1中。http://ruby-doc.org/core-2.1.0/Array.html#method- i-to_h – hirolau

+0

恩,謝謝,我不知道。 – tokhi

0

以防萬一,現場哈希的解決方案:

result = Hash.new { |hash, k| h1[h2.key(k) || k] } 

現在人們可能延長h1h2,結果將反映新的增加(不是已經處理的鍵中的改變,但是)。

實例化這個哈希與先前存在的h1h2,一個需要執行類似:

(h2.values | (h1.keys - h2.keys)).map { |k| [k, result[k]] }.to_h 

More info