Buscar um ou mais objetos em um array de objetos em Ruby
Criado em: 16/02/2013
Como fariamos para conseguir pegar um objeto de um array
de objetos baseado em uma propriedade do objeto?
Vamos ao seguinte cenário, dado que tenhamos o seguinte array
de OpenStruct
s, utilizamos OpenStruct
pela facilidade mas poderia ser qualquer objeto ou mesmo um Hash
.
require 'ostruct'
games = [
OpenStruct.new(
id: 53,
name: "Gears of War",
gender: "action"
),
OpenStruct.new(
id: 54,
name: "Uncharted",
gender: "action"
)
]
Se quisessemos apenas o objeto com o id 53, poderiamos usar o Enumerable#select que nos retornaria:
puts games.select { |g| g.id == 53 } # => [#<OpenStruct id=53, name="Gears of War", gender="action">]
como pode ver o select
nos retorna uma coleção, sendo assim ele retorna todos os objetos que satisfazerem a condição passada ao bloco, veja o exemplo a seguir:
puts games.select { |g| g.gender == 'action' } # => [#<OpenStruct id=53, name="Gears of War", gender="action">, #<OpenStruct id=54, name="Uncharted", gender="action">]
Como temos 2 objetos com o gender igual a action ele retornou os 2. Caso queiramos apenas o primeiro objeto que satisfazer a condição, o que faz sentido no caso de uma busca por id por exemplo, podemos utilizar o Enumerable#detect veja:
puts games.detect { |g| g.id == 53 } # => #<OpenStruct id=53, name="Gears of War", gender="action">
Então fica a dica precisando buscar em uma coleção, uma coleção de objetos que satisfaçam uma certa condição utilizar o select
, precisando retornar um único valor que satisfaça a condição utilizar o detect
.
Comentários
Comentários powered by Disqus