Вам даны два массива:
countries= [['Canada', 2], ['Chile', 1], ['China', 1]]
keys = [:country, :count]
Вы могли бы написать
[keys].product(countries).map { |arr| arr.transpose.to_h }
#=> [{:country=>"Canada", :count=>2},
# {:country=>"Chile", :count=>1},
# {:country=>"China", :count=>1}]
или просто
countries.map { |country, cnt| { country: country, count: cnt } }
#=> [{:country=>"Canada", :count=>2},
# {:country=>"Chile", :count=>1},
# {:country=>"China", :count=>1}]
но первое имеет преимущество в том, что не нужно менять код в именах смен ключей. На самом деле, не было бы необходимости менять код, если изменились массивы countries
и keys
, при условии countries[i].size == keys.size
для всех i = 0..countries.size-1
. (См. Пример в конце.)
Первоначальный шаг для первого расчета выглядит следующим образом.
a = [keys].product(countries)
#=> [[[:country, :count], ["Canada", 2]],
# [[:country, :count], ["Chile", 1]],
# [[:country, :count], ["China", 1]]]
См. Массив # product . Теперь у нас есть
a.map { |arr| arr.transpose.to_h }
map
передает первый элемент a
в блок и устанавливает переменную блока arr
в это значение:
arr = a.first
#=> [[:country, :count], ["Canada", 2]]
Затем выполняется расчет блока:
b = arr.transpose
#=> [[:country, "Canada"], [:count, 2]]
b.to_h
#=> {:country=>"Canada", :count=>2}
Итак, мы видим, что a[0]
(arr
) отображается на {:country=>"Canada", :count=>2}
. Следующие два элемента a
затем передаются в блок и выполняются аналогичные вычисления, после чего map
возвращает требуемый массив из трех хешей. См. Array # transpose и Array # to_h .
Вот второй пример с использованием того же кода.
countries= [['Canada', 2, 9.09], ['Chile', 1, 0.74],
['China', 1, 9.33], ['France', 1, 0.55]]
keys = [:country, :count, :area]
[keys].product(countries).map { |arr| arr.transpose.to_h }
#=> [{:country=>"Canada", :count=>2, :area=>9.09},
# {:country=>"Chile", :count=>1, :area=>0.74},
# {:country=>"China", :count=>1, :area=>9.33},
# {:country=>"France", :count=>1, :area=>0.55}]