我有一个像这样的数组:
result = [
{:label=>:road, :value=>"carl-schurz str."},
{:label=>:house_number, :value=>"25"},
{:label=>:postcode, :value=>"36041"},
{:label=>:city, :value=>"fulda"},
{:label=>:state_district, :value=>"fulda kreis"}
]
我想返回如下哈希:
output = {
"road" => "carl-schurz str.",
"house_number" => "25",
"postcode" => "36041",
"city" => "fulda",
"state_district" => "fulda kreis"
}
因为我知道哈希也可以有位置,所以我一直在尝试类似的事情:
result.each do |r|
r.each do |key, value|
output[value[0]] = value[1]
end
end
但是我没有得到正确的结果。
答案 0 :(得分:3)
只需添加一些其他解决方案即可。
我个人会做这样的事情:
Hash[result.map { |h| [h[:label], h[:value]] }]
您可能要研究的另一件事是each_with_object
,它对于构造新对象非常方便。在这种情况下,它将类似于:
new_hash = result.each_with_object({}) do |h, r|
r[h[:label]] = h[:value]
end
答案 1 :(得分:2)
您可以轻松地通过“地图” ...
result.map { |h| [h[:label], h[:value]] }.to_h
Hash[result.map { |h| [h[:label], h[:value]] }]
...甚至“减少” ...
result.reduce(Hash.new) { |h,o| h[o[:label]] = o[:value]; h }
这个简单的基准测试表明“减少”形式比其他形式要快一些:
require 'benchmark'
result = [
{:label=>:road, :value=>"carl-schurz str."},
{:label=>:house_number, :value=>"25"},
{:label=>:postcode, :value=>"36041"},
{:label=>:city, :value=>"fulda"},
{:label=>:state_district, :value=>"fulda kreis"}
]
n = 1_000_000
Benchmark.bmbm do |x|
x.report('Hash[] ') { n.times { Hash[result.map { |h| [h[:label], h[:value]] }] } }
x.report('map...to_h') { n.times { result.map { |h| [h[:label], h[:value]] }.to_h } }
x.report('reduce ') { n.times { result.reduce(Hash.new) { |h,o| h[o[:label]] = o[:value]; h } } }
end
# user system total real
# Hash[] 1.830000 0.040000 1.870000 ( 1.882664)
# map...to_h 1.760000 0.040000 1.800000 ( 1.810998)
# reduce 1.590000 0.030000 1.620000 ( 1.633808) *
答案 2 :(得分:2)
result.map { |h| h.values_at(:label, :value) }.to_h
#=> {:road=>"carl-schurz str.", :house_number=>"25", :postcode=>"36041",
# :city=>"fulda", :state_district=>"fulda kreis"}
答案 3 :(得分:1)
另一种方式:
params: { id: {value: ""}
答案 4 :(得分:0)
我能够使用以下方法获得所需的结果:
result.each do |r|
output[r.values[0]] = values[1]
end
知道使用hash_object.values是关键。