Dilbert Karbes
Dilbert Karbes

Reputation: 41

Combine two unequal arrays to hash

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

Upvotes: 3

Views: 150

Answers (2)

eugen
eugen

Reputation: 9226

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

Upvotes: 7

Maxim Pontyushenko
Maxim Pontyushenko

Reputation: 3053

This should do the work:

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

Upvotes: 5

Related Questions