Превращение массива в хеш - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть массив хэшей в ruby:

my_array = [{"apples" => 5}, {"oranges" => 12}]

Я бы хотел превратить его в хеш, где ключи хеша равны значениям индекса массива +1, вот так:

my_hash = {"1"=>{"apples"=> 5}, "2"=>{"oranges" => 12}}

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 26 сентября 2019

Вы также можете Enumerable # zip с диапазоном, а затем преобразовать Array # to_h :

(1..my_array.size).zip(my_array).to_h
#=> {1=>{"apples"=>5}, 2=>{"oranges"=>12}}

Как это работает

my_array.size #=> 2 возвращает размер массива в виде целого числа.

(1..my_array.size) это включающий диапазон , который перечисляет целые числа форму 1 до размера массива, 2 в данном случае.

A Range отвечает на Enumerable # zip , поэтому, например, вы можете сделать это, получив массив пар:

(1..3).zip(:a..:c) #=> [[1, :a], [2, :b], [3, :c]]

Наконец, массив пар можно преобразовать в хэш, см. Array # to_h :

[[1, :a], [2, :b], [3, :c]].to_h #=> {1=>:a, 2=>:b, 3=>:c}

Поскольку диапазон состоит из целых чисел, ключи хеша являются целыми.Но вы можете настроить строку кода, чтобы получить строки в качестве ключей.

3 голосов
/ 26 сентября 2019

Вы можете попробовать использовать Enumerator # with_index , чтобы иметь индекс, и Enumerator # each_with_object , чтобы создать новый хеш

my_array = [{"apples"=> 5}, {"oranges" => 12}]
my_hash = my_array.each.with_index.with_object({}){|(hsh, i), e| e[(i+1).to_s] = hsh}
# => {"1"=>{"apples"=> 5}, "2"=>{"oranges" => 12}}
3 голосов
/ 26 сентября 2019
my_array = [{"apples" => 5}, {"oranges" => 12}]
my_hash = my_array.each_with_index.map{|h, i| [(i+1).to_s,  h]}.to_h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...