Quelle est la manière la plus élégante de sélectionner des objets dans un tableau qui sont uniques par rapport à un ou plusieurs attributs?
Ces objets étant stockés dans ActiveRecord, l’utilisation des méthodes de AR conviendrait également.
Quelle est la manière la plus élégante de sélectionner des objets dans un tableau qui sont uniques par rapport à un ou plusieurs attributs?
Ces objets étant stockés dans ActiveRecord, l’utilisation des méthodes de AR conviendrait également.
Utilisez Array#uniq
avec un bloc:
@photos = @photos.uniq {|p| p.album_id}
Ajouter l' uniq_by
méthode de Tableau dans votre projet. Il fonctionne par analogie avec l' sort_by
. Donc, uniq_by
est uniq
comme sort_by
est sort
. Utilisation:
uniq_array = my_array.uniq_by {|obj| obj.id}
La mise en œuvre:
class Array
def uniq_by(&blk)
transforms = []
self.select do |el|
should_keep = !transforms.include?(t=blk[el])
transforms << t
should_keep
end
end
end
Notez qu'il retourne un nouveau tableau plutôt que de modifier votre actuel en place. Nous n'avons pas écrit une uniq_by!
méthode, mais il devrait être assez facile, si vous vouliez.
EDIT: Tribalvibes souligne que cette mise en œuvre est O(n^2). Mieux serait quelque chose comme (non testé)...
class Array
def uniq_by(&blk)
transforms = {}
select do |el|
t = blk[el]
should_keep = !transforms[t]
transforms[t] = true
should_keep
end
end
end
J'avais initialement suggéré d'utiliser la méthode select
sur Array. En être témoin:
[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
nous renvoie [2,4,6]
.
Mais si vous voulez le premier objet de ce type, utilisez detect
.
[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
nous donne 4
.
Je ne sais pas trop ce que vous allez faire ici.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.