Was ist die eleganteste Methode, um Objekte in einem Array auszuwählen, die in Bezug auf ein oder mehrere Attribute eindeutig sind?
Diese Objekte werden in ActiveRecord gespeichert, daher ist die Verwendung der AR-Methoden ebenfalls in Ordnung.
ruby-on-rails
ruby
arrays
unique
sutee
quelle
quelle
require 'backports'
:-)@photos.uniq &:album_id
Fügen Sie die
uniq_by
Methode Array in Ihrem Projekt hinzu. Es funktioniert analog zusort_by
. Souniq_by
ist esuniq
wie essort_by
istsort
. Verwendung:Die Umsetzung:
Beachten Sie, dass ein neues Array zurückgegeben wird, anstatt das aktuelle Array zu ändern. Wir haben keine
uniq_by!
Methode geschrieben , aber es sollte einfach genug sein, wenn Sie wollten.EDIT: Tribalvibes weist darauf hin, dass diese Implementierung O (n ^ 2) ist. Besser wäre so etwas wie (ungetestet) ...
quelle
Tun Sie es auf Datenbankebene:
quelle
Mit diesem Trick können Sie eindeutige Elemente mit mehreren Attributen aus dem Array auswählen:
quelle
Ich hatte ursprünglich vorgeschlagen, die
select
Methode auf Array zu verwenden. Nämlich:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
gibt uns[2,4,6]
zurück.Wenn Sie jedoch das erste derartige Objekt möchten, verwenden Sie
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
gibt uns4
.Ich bin mir allerdings nicht sicher, was Sie hier vorhaben.
quelle
Ich mag es, wenn jmah einen Hash verwendet, um die Einzigartigkeit durchzusetzen. Hier sind noch ein paar Möglichkeiten, diese Katze zu häuten:
Das ist ein schöner 1-Liner, aber ich vermute, dass dies etwas schneller sein könnte:
quelle
Wenn ich Ihre Frage richtig verstehe, habe ich dieses Problem mithilfe des quasi-hackigen Ansatzes gelöst, bei dem die Marshaled-Objekte verglichen werden, um festzustellen, ob Attribute variieren. Die Injektion am Ende des folgenden Codes wäre ein Beispiel:
quelle
Der eleganteste Weg, den ich gefunden habe, ist ein Spin-off
Array#uniq
mit einem Block… Es liest sich auch besser!
quelle
Sie können einen Hash verwenden, der nur einen Wert für jeden Schlüssel enthält:
quelle
Verwenden Sie Array # uniq mit einem Block:
Oder ein prägnanterer Ansatz:
quelle
Schienen hat auch eine
#uniq_by
Methode.Referenz: Parametrisiertes Array # uniq (dh uniq_by)
quelle
Ich mag die Antworten von jmah und Head. Aber behalten sie die Array-Reihenfolge bei? Sie könnten in späteren Versionen von Ruby verwendet werden, da einige Anforderungen zur Beibehaltung der Reihenfolge der Hash-Einfügung in die Sprachspezifikation geschrieben wurden, aber hier ist eine ähnliche Lösung, die ich gerne verwende und die die Reihenfolge unabhängig davon beibehält.
quelle
ActiveSupport-Implementierung:
quelle
Wenn Sie nun nach den Attributwerten sortieren können, können Sie Folgendes tun:
Das ist für ein 1-Attribut einzigartig, aber das gleiche kann mit lexikographischer Sortierung gemacht werden ...
quelle