¿Cuál es la forma más elegante de seleccionar objetos en una matriz que sean únicos con respecto a uno o más atributos?
Estos objetos se almacenan en ActiveRecord, por lo que usar los métodos de AR también estaría bien.
ruby-on-rails
ruby
arrays
unique
sutee
fuente
fuente
require 'backports'
:-)@photos.uniq &:album_id
Agregue el
uniq_by
método a Array en su proyecto. Funciona por analogía consort_by
. Asíuniq_by
esuniq
comosort_by
essort
. Uso:La implementación:
Tenga en cuenta que devuelve una nueva matriz en lugar de modificar la actual en su lugar. No hemos escrito un
uniq_by!
método, pero debería ser lo suficientemente fácil si quisieras.EDITAR: Tribalvibes señala que esa implementación es O (n ^ 2). Mejor sería algo así (no probado) ...
fuente
Hazlo en el nivel de la base de datos:
fuente
Puede usar este truco para seleccionar elementos únicos de varios atributos de la matriz:
fuente
Originalmente había sugerido usar el
select
método en Array. Esto es:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
nos[2,4,6]
devuelvePero si quieres el primer objeto de este tipo, úsalo
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
nos da4
.Sin embargo, no estoy seguro de lo que vas a hacer aquí.
fuente
Me gusta el uso que hace Jmah de un Hash para imponer la singularidad. Aquí hay un par de formas más de pelar a ese gato:
Es un buen 1-liner, pero sospecho que esto podría ser un poco más rápido:
fuente
Si entiendo su pregunta correctamente, he abordado este problema utilizando el enfoque casi hacky de comparar los objetos Marshaled para determinar si algunos atributos varían. La inyección al final del siguiente código sería un ejemplo:
fuente
La forma más elegante que he encontrado es un spin-off usando
Array#uniq
un bloque... se lee mejor también!
fuente
Puede usar un hash, que contiene solo un valor para cada clave:
fuente
Use Array # uniq con un bloque:
O un enfoque más conciso:
fuente
Rails también tiene un
#uniq_by
método.Referencia: matriz parametrizada # uniq (es decir, uniq_by)
fuente
Me gustan las respuestas de JMAH y Head. ¿Pero conservan el orden de la matriz? Es posible que en versiones posteriores de ruby, ya que ha habido algunos requisitos de preservación del orden de inserción hash escritos en la especificación del lenguaje, pero aquí hay una solución similar que me gusta usar que independientemente conserva el orden.
fuente
Implementación de ActiveSupport:
fuente
Ahora, si puede ordenar los valores de los atributos, esto se puede hacer:
Eso es para un atributo 1 único, pero se puede hacer lo mismo con el tipo lexicográfico ...
fuente