Массив хэшей в хэш хэша - PullRequest
       1

Массив хэшей в хэш хэша

0 голосов
/ 06 сентября 2018

Как мне преобразовать массив хэшей response:

response = [
  {id: 1, name: 'foo', something: {}},
  {id: 2, name: 'bar', something: {}}
]

где :id s уникальны, для хэша хэшей transformed со значениями в качестве элементов response и ключом в качестве соответствующего значения :id, превращенным в строку следующим образом?

transformed = {
  '1' => {id: 1, name: 'foo', something: {}},
  '2' => {id: 2, name: 'bar', something: {}}
}

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

другие опции

response.map{ |i| [i[:id].to_s, i] }.to_h
#=> {"1"=>{:id=>1, :name=>"foo", :something=>{}}, "2"=>{:id=>2, :name=>"bar", :something=>{}}}

Hash[response.map{ |i| [i[:id].to_s, i] }]
#=> {"1"=>{:id=>1, :name=>"foo", :something=>{}}, "2"=>{:id=>2, :name=>"bar", :something=>{}}

response.inject({}) { |h, i| h[i[:id].to_s] = i; h }
#=> {"1"=>{:id=>1, :name=>"foo", :something=>{}}, "2"=>{:id=>2, :name=>"bar", :something=>{}}}

@ решение Стефана

response.each.with_object({}) { |i, h| h[i[:id].to_s] = i }
#=> {"1"=>{:id=>1, :name=>"foo", :something=>{}}, "2"=>{:id=>2, :name=>"bar", :something=>{}}}

@ решение Engineeringmnky

response.inject({}) {|h,i| h.merge({i[:id].to_s => i})} 
#=> {"1"=>{:id=>1, :name=>"foo", :something=>{}}, "2"=>{:id=>2, :name=>"bar", :something=>{}}}
0 голосов
/ 06 сентября 2018

Если в результирующем хеше будет ключ id, нет необходимости снова сохранять его в значении. Посмотрите мое решение, используя each_with_objectid удалено из значения):

input
 => [{:id=>1, :name=>"foo", :something=>{}},
     {:id=>2, :name=>"bar", :something=>{}}]

input.each_with_object({}) do |hash, out|
  out[hash.delete(:id).to_s] = hash
end
 => {"1"=>{:name=>"foo", :something=>{}},
     "2"=>{:name=>"bar", :something=>{}}}

Примечание: Это изменит массив input навсегда.

Однако, чтобы получить точный результат, указанный в вопросе, выполните:

input.each_with_object({}) do |hash, out|
  out[hash[:id].to_s] = hash
end
 => {"1"=>{:id=>1, :name=>"foo", :something=>{}},
     "2"=>{:id=>2, :name=>"bar", :something=>{}}}
0 голосов
/ 06 сентября 2018

Поскольку ruby 2.4.0, вы можете использовать собственный Hash#transform_values метод:

response
.group_by{|h| h[:id]}
.transform_keys(&:to_s)
.transform_values(&:first)
# => {
#      "1"=>{:id=>1, :name=>"foo", :something=>{}},
#      "2"=>{:id=>2, :name=>"bar", :something=>{}}
#    }
0 голосов
/ 06 сентября 2018
response = [{ id: 1, name: 'foo', something: {} },{ id: 2, name: 'bar', something: { } }]    
hash = Hash.new    
response.each {|a| hash[a[:id].to_s] = a }
puts hash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...