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 OpenStructs, 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