2016-04-14 53 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