通过键连接两个Ruby哈希

通过键连接两个Ruby哈希,ruby,hash,Ruby,Hash,我有两个如下所示的散列: h1 = {key1: 'Roses are', key2: 'Violets are'} h2 = {key1: 'Red', key2: 'Blue'} result = {'Roses are' => 'Red', 'Violets are' => 'Blue'} 我想通过键连接它们,这样我可以得到如下哈希: h1 = {key1: 'Roses are', key2: 'Violets are'} h2 = {key1: 'Red', key2:

我有两个如下所示的散列:

h1 = {key1: 'Roses are', key2: 'Violets are'}
h2 = {key1: 'Red', key2: 'Blue'}
result = {'Roses are' => 'Red', 'Violets are' => 'Blue'}
我想通过键连接它们,这样我可以得到如下哈希:

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] }
我想知道标准库中是否有这样做的方法,或者是否可以用更少的代码来完成此操作。

压缩值:

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

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

您需要1:1映射,因此可以:

h1.map { |k, v| ... }
h1
中的值将成为新键:

h1.map { |k, v| [v, ...] }
h2
中的相应值成为新值:

h1.map { |k, v| [v, h2[k]] }
#=> [["Roses are", "Red"], ["Violets are", "Blue"]]
并将其转换回哈希:

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

您需要1:1映射,因此可以:

h1.map { |k, v| ... }
h1
中的值将成为新键:

h1.map { |k, v| [v, ...] }
h2
中的相应值成为新值:

h1.map { |k, v| [v, h2[k]] }
#=> [["Roses are", "Red"], ["Violets are", "Blue"]]
并将其转换回哈希:

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

更少的代码?这只有两行。如果您真的需要,您可以使用带有对象的每个对象将其缩减为一行,例如:
result=h1。带有对象的每个对象({}{{})(键,值),h3}h3[value]=h2[key]}
更少的代码?这只有两行。如果你真的需要,你可以使用每个带有对象的对象将它减少到一行,比如:
result=h1。每个带有对象的对象({}{}{{124;(键,值),h3}h3[value]=h2[key]}
谢谢,但是当我改变第二个散列的顺序时,它不起作用,例如:h2={key2:'Blue',key1:'Red}@msayen
h1.values.zip(h2.values.\u在(*h1.keys)).to_h
可以解决这个问题。获取给定键的值(按该顺序)。也许您应该相应地更改示例代码,这样我们就不会做出错误的假设。谢谢,但当我更改第二个哈希中的顺序时,它不起作用,例如:h2={key2:'Blue',key1:'Red'}。@msayen
h1.values.zip(h2.values_at(*h1.keys))。to_h
会解决这个问题。获取给定键的值(按该顺序)。也许您应该相应地修改示例代码,这样我们就不会做出错误的假设。