2017-10-11 1 views
0

J'ai deux hash qui ressemblent à ceci:Joignez-vous à deux Ruby hachages par les clés

h1 = {key1: 'Roses are', key2: 'Violets are'} 
h2 = {key1: 'Red', key2: 'Blue'} 

je voudrais les rejoindre par les clés afin que je reçois un hachage comme ceci:

result = {'Roses are' => 'Red', 'Violets are' => 'Blue'} 

I ont un code qui fait l'affaire:

result = {} 
h1.each { |key, value| result[value] = h2[key] } 

Je me demande s'il y a une méthode dans le répertoire lib standard pour faire ceci ou si cela peut être fait avec moins code.

+0

Moins de code? Ceci est seulement 2 lignes. Si vous en avez vraiment besoin, vous pouvez le réduire à une ligne en utilisant each_with_object, comme: 'result = h1.each_with_object ({}) {| (clé, valeur), h3 | h3 [valeur] = h2 [clé]} ' – Santhosh

Répondre

5

Vous voulez un 1: cartographie 1, donc map travaillerais:

h1.map { |k, v| ... } 

Les valeurs de h1 deviennent les nouvelles clés:

h1.map { |k, v| [v, ...] } 

Les valeurs correspondantes de h2 deviennent les nouvelles valeurs:

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

Et to_h convertit ce retour dans un hachage:

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

Zip valeurs:

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

Merci, mais cela ne fonctionne pas quand je change l'ordre dans le deuxième hash, par exemple: h2 = {key2: 'Blue', key1: 'Red'}. – msayen

+0

@msayen 'h1.values.zip (h2.values_at (* h1.keys)). To_h' réparerait cela. ['values_at'] (http://ruby-doc.org/core-2.4.2/Hash.html#method-i-values_at) récupère les valeurs pour les clés données (dans cet ordre). Peut-être que vous devriez changer votre code d'exemple en conséquence afin de ne pas faire de fausses suppositions. – Stefan