[list.keys].product(list.values.transpose).map { |a| a.transpose.to_h }
#=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw",
# :state=>"la", :color=>"red", :tree=>"oak", :animal=>"cat",
# :clothes=>"tie"},
# {:letter=>"b", :number=>"two", :fruit=>"pear", :car=>"mb",
# :state=>"ny", :color=>"white", :tree=>"pine", :animal=>"dog",
# :clothes=>"sock"},
# {:letter=>"c", :number=>"three", :fruit=>"kiwi", :car=>"bmw",
# :state=>"fl", :color=>"black", :tree=>"maple", :animal=>"rat",
# :clothes=>"glove"}]
Предположим, что list
были определены следующим образом.
list = {
letter: ['a', 'b' ],
number: ['one', 'two' ],
fruit: ['apple', 'pear'],
car: ['vw', 'mb' ]
}
Шаги будут следующими:
b = [list.keys]
#=> [[:letter, :number, :fruit, :car]]
c = list.values
#=> [["a", "b"], ["one", "two"], ["apple", "pear"], ["vw", "mb"]]
d = c.transpose
#=> [["a", "one", "apple", "vw"],
# ["b", "two", "pear", "mb"]]
e = b.product(d)
#=> [[[:letter, :number, :fruit, :car], ["a", "one", "apple", "vw"]],
# [[:letter, :number, :fruit, :car], ["b", "two", "pear", "mb"]]]
e.map { |a| a.transpose.to_h }
#=> [{:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"},
# {:letter=>"b", :number=>"two", :fruit=>"pear", :car=>"mb"}]
Давайте рассмотрим последний шаг более внимательно.map
передает первый элемент e
в блок и устанавливает для переменной блока a
значение:
a = e.first
#=> [[:letter, :number, :fruit, :car],
# ["a", "one", "apple", "vw"]]
Расчет блока выполняется следующим образом.
f = a.transpose
#=> [[:letter, "a"], [:number, "one"], [:fruit, "apple"], [:car, "vw"]]
f.to_h
#=> {:letter=>"a", :number=>"one", :fruit=>"apple", :car=>"vw"}
Остальные расчеты для e.map { |a| a.transpose.to_h }
аналогичны.