3
votes

I need help with creating hash representing every possible combination of two arrays in Ruby.

What I have:

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

What I need:

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' }
]

Important: I will never know how many items "numbers" or "letters" array contains (only that these are never equal in length), this varies per case.

So far following has gotten me closest to goal, but this submits all the letters to each number all together and I don't understand how to take it further without errors:

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

2 Answers

7
votes

product might be what you're looking for:

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"}]
5
votes

This should do the work:

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