Saya memiliki serangkaian hash seperti ini:
[{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
Dan saya mencoba memetakan ini ke dalam satu hash seperti ini:
{"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}
Saya telah mencapainya dengan menggunakan
par={}
mitem["params"].each { |h| h.each {|k,v| par[k]=v} }
Tapi saya bertanya-tanya apakah mungkin melakukan ini dengan cara yang lebih idiomatis (sebaiknya tanpa menggunakan variabel lokal).
Bagaimana saya bisa melakukan ini?
ruby-on-rails
ruby
arrays
hash
Bart Platak
sumber
sumber
input.reduce(:merge)
?merge!
bukanmerge
itu akan mengubah hash pertama (yang mungkin tidak Anda inginkan) tetapi tidak akan membuat hash perantara untuk setiap penggabungan baru.Bagaimana tentang:
h = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] r = h.inject(:merge)
sumber
Gunakan #inject
hashes = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] merged = hashes.inject({}) { |aggregate, hash| aggregate.merge hash } merged # => {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
sumber
Di sini Anda dapat menggunakan injeksi atau pengurangan dari kelas Enumerable karena keduanya adalah alias satu sama lain sehingga tidak ada manfaat kinerja untuk keduanya.
sample = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] result1 = sample.reduce(:merge) # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"} result2 = sample.inject(:merge) # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
sumber