2013-11-14 3 views
13

В этом коде:Есть ли способ доступа к хэш-значениям в массиве хэшей?

arr = [ { id: 1, body: 'foo'}, { id: 2, body: 'bar' }, { id: 3, body: 'foobar' }] 
arr.map { |h| h[:id] } # => [1, 2, 3] 

Есть ли уборщик способ получения значений из массива хэшей, как это?

Underscore.js has pluck, Мне интересно, есть ли эквивалент Ruby.

ответ

21

Если вы не возражаете, обезьяны-заплаток, вы можете отломи себя:

arr = [{ id: 1, body: 'foo'}, { id: 2, body: 'bar' }, { id: 3, body: 'foobar' }] 

class Array 
    def pluck(key) 
    map { |h| h[key] } 
    end 
end 

arr.pluck(:id) 
=> [1, 2, 3] 
arr.pluck(:body) 
=> ["foo", "bar", "foobar"] 

Кроме того, это выглядит как someone has already generalised this for Enumerables, а кто-то for a more general solution.

+1

В то время как я чувствую, что 'pluck' является полезным дополнением, добавление семантики' invoke' в ссылку «более общее решение» довольно глупо в Ruby, поскольку 'Symbol # to_proc' позаботится об этом для вас. '[1,2,3,4] .map &: to_s' работает без перехвата обезьян. –

+1

Ярлык 'Symbol # to_proc' /' []. Map &: method_name' не поможет с 'hash [key]', потому что 'Hash # []' нуждается в ключевом параметре. – alxndr

Смежные вопросы