如何变换哈希数组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: {}}
}
答案 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=>{}}}