Mam tablicę takich skrótów:
[{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
I próbuję odwzorować to na pojedynczy hash w następujący sposób:
{"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}
Osiągnąłem to za pomocą
par={}
mitem["params"].each { |h| h.each {|k,v| par[k]=v} }
Ale zastanawiałem się, czy można to zrobić w bardziej idiomatyczny sposób (najlepiej bez użycia zmiennej lokalnej).
Jak mogę to zrobić?
ruby-on-rails
ruby
arrays
hash
Bart Platak
źródło
źródło
input.reduce(:merge)
?merge!
zamiastmerge
tego, zmodyfikuje pierwszy hash (którego możesz nie chcieć), ale nie utworzy pośredniego skrótu dla każdego nowego scalania.Co powiesz na:
h = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] r = h.inject(:merge)
źródło
Użyj #inject
hashes = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] merged = hashes.inject({}) { |aggregate, hash| aggregate.merge hash } merged # => {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
źródło
Tutaj można użyć inject lub zmniejszenia od przeliczalny klasy jak oboje są aliasy siebie więc nie ma korzyści wydajność albo.
sample = [{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}] result1 = sample.reduce(:merge) # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"} result2 = sample.inject(:merge) # {"testPARAM1"=>"testVAL1", "testPARAM2"=>"testVAL2"}
źródło