哈希数组到哈希哈希

时间:2018-09-06 09:55:56

标签: ruby

如何变换哈希数组response

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

其中:id是唯一的,是哈希值transformed的散列,其值作为response的元素,而键作为对应的:id的值变成一个字符串如下?

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

4 个答案:

答案 0 :(得分:3)

由于 X ,您可以使用本机 Hash#transform_values 方法:

ruby 2.4.0

答案 1 :(得分:2)

其他选项

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=>{}}}

@Stefan的解决方案

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

@engineersmnky的解决方案

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果将id作为结果哈希中的键,则无需再次将其保留在值中。使用each_with_object(从值中删除id)来看我的解决方案:

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=>{}}}