Eu tenho isto:
hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
e eu quero chegar a este: [["a","b","c"],["b","c"]]
Parece que deveria funcionar, mas não:
hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
Alguma sugestão?
hash.values
sendo a melhor IMO). Mas gostaria de salientar que, quando você fornecer um bloco,Hash#each
ele retornará apenas o valor total do hash. Se você quiser fazer uma operação em cada item e retorná-lo como um array, useHash#collect
ou seu aliasHash#map
. Mais informações sobre Enumerables aqui .Respostas:
Além disso, um pouco mais simples ....
Ruby doc aqui
fonte
map
), porque gosto muito disso!Hash#values
não é apenas mais simples, mas também mais eficiente. Comparetime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'
comtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
Eu usaria:
fonte
Hash#values
.Enumerable#collect
pega um bloco e retorna uma matriz dos resultados da execução do bloco uma vez em cada elemento do enumerável. Portanto, este código apenas ignora as chaves e retorna uma matriz de todos os valores.O
Enumerable
módulo é muito bom. Conhecê-lo bem pode economizar muito tempo e muito código.fonte
hash.values
é , em última análise, a resposta correta aqui.hash.map(&:second)
:)fonte
É tão simples quanto
isso retornará uma nova matriz preenchida com os valores do hash
se você quiser armazenar essa nova matriz, faça
fonte
Existe também este:
Por que funciona:
A
&
chamato_proc
no objecto, e passa-o como um bloco para o método.fonte