Больше, чем вам нужно в этом случае, но с How to merge array of hashes to get hash of arrays of values вы можете получить их все один раз:
merged = a.inject{ |h1,h2| h1.merge(h2){ |_,v1,v2| [*v1,*v2] } }
p merged[:a] #=> ["a", "b", "c"]
p merged[:b] #=> ["3", "2", "1"]
Кроме того, если вы используете что-то вроде Struct или OpenStruct для своих значений вместо хешей - или любого объекта, который позволяет вам получать значения «a» как метод, который не требует параметров, вы можете использовать удобство Symbol#to_proc
для вашей карты:
AB = Struct.new(:a,:b)
all = [ AB.new('a','3'), AB.new('b','2'), AB.new('c','1') ]
#=> [#<AB a="a", b="3">, #<AB a="b", b="2">, #<AB a="c", b="1">]
all.map(&:a) #=> ["a", "b", "c"]
all.map(&:b) #=> ["3", "2", "1"]
Я бы сказал, что функция карты примерно такая же сжатая, как вы ее получите. –
да, но не как читаемый ... = (я нашел эту работу с массивом моделей рельсов ... results.collect (&: key_name), но не с хэшами. –
FYI #collect и #map - это то же самое. что второй не работает, так это то, что синтаксис, который вы использовали, отправляет с ключом как аргумент, а не вызывает [], как вы думаете. Я предпочитаю карту. Использование перечислимых карт очень читаемо и является одной из функций, которые я использую больше всего как программист Ruby. –