2016-04-25 21 views
3

Ich brauche Hilfe beim Erstellen von Hash-Darstellung jeder möglichen Kombination von zwei Arrays in Ruby.Kombinieren Sie zwei ungleiche Arrays zu Hash

Was ich habe:

numbers = [1, 2] 
letters = ['q', 'w', 'e', 'r'] 

Was ich brauche:

combination = [ 
{ number: 1, letter: 'q' }, 
{ number: 1, letter: 'w' }, 
{ number: 1, letter: 'e' }, 
{ number: 1, letter: 'r' }, 
{ number: 2, letter: 'q' }, 
{ number: 2, letter: 'w' }, 
{ number: 2, letter: 'e' }, 
{ number: 2, letter: 'r' } 
] 

Wichtig: Ich werde nie wissen, wie viele Elemente „Zahlen“ oder „Buchstaben“ Array enthält (nur, dass diese nie gleich lang) variiert dies je nach Fall.

Bisher hat folgende mir am nächsten Ziel bekommen, aber dies trägt alle Briefe an jede Nummer alle zusammen und ich verstehe nicht, wie es ohne Fehler weiter gehen:

combination = Hash.new [] 
    numbers.each do |nr| 
    combination[:number => nr] = [:letter => letters] 
    end 

Antwort

7

product sein könnte, was Sie suchen:

numbers.product(letters).map { |n, l| {number: n, letter: l} } 
# => [{:number=>1, :letter=>"q"}, {:number=>1, :letter=>"w"}, {:number=>1, :letter=>"e"}, {:number=>1, :letter=>"r"}, {:number=>2, :letter=>"q"}, {:number=>2, :letter=>"w"}, {:number=>2, :letter=>"e"}, {:number=>2, :letter=>"r"}] 
+2

hinzufügen weiter: 'numbers.product (letters) .map {| a, b | {"Nummer" => a, "Brief" => b}} ':) – shivam

+0

Schöne Lösung Eugen – Jon

5

Dies ist das tun sollte Arbeit:

combination = [] 
numbers.each do |n| 
    letters.each { |l| combination << {number: n, letter: l} } 
end 
+0

Danke, das i Genau das, was ich alleine nicht herausfinden konnte! :) –

+1

Dies kann mit * each_with_object * noch übersichtlicher gemacht werden ... 'numbers.each_with_object ([]) do | n, combination | ...' –

Verwandte Themen