144 Stimmen

Uniq nach Objekt-Attribut in Ruby

Wie lassen sich Objekte in einem Array, die in Bezug auf ein oder mehrere Attribute eindeutig sind, am elegantesten heraussuchen?

Diese Objekte sind in ActiveRecord gespeichert, so dass die Verwendung von AR-Methoden auch in Ordnung wäre.

2voto

apb Punkte 3202

Rails hat auch eine #uniq_by Methode.

Referenz: Parametriertes Array#uniq (d. h. uniq_by)

1voto

TKH Punkte 798

Mir gefallen die Antworten von jmah und Head. Aber bewahren sie die Array-Reihenfolge? Sie könnten in späteren Versionen von Ruby, da es einige Hash-Einfügung-Reihenfolge-erhaltende Anforderungen in die Sprachspezifikation geschrieben wurden, aber hier ist eine ähnliche Lösung, die ich gerne verwenden, die Reihenfolge unabhängig bewahrt.

h = Set.new
objs.select{|el| h.add?(el.attr)}

1voto

grosser Punkte 14107

ActiveSupport-Implementierung:

def uniq_by
  hash, array = {}, []
  each { |i| hash[yield(i)] ||= (array << i) }
  array
end

0voto

Purfideas Punkte 3230

Wenn Sie nun nach den Attributwerten sortieren können, ist dies möglich:

class A
  attr_accessor :val
  def initialize(v); self.val = v; end
end

objs = [1,2,6,3,7,7,8,2,8].map{|i| A.new(i)}

objs.sort_by{|a| a.val}.inject([]) do |uniqs, a|
  uniqs << a if uniqs.empty? || a.val != uniqs.last.val
  uniqs
end

Das ist für ein 1-Attribut eindeutig, aber die gleiche Sache kann mit lexikographischer Sortierung getan werden ...

0voto

Wenn Sie mit Arrays nicht vertraut sind, können wir auch versuchen, Duplikate durch Sets zu eliminieren

set = Set.new
set << obj1
set << obj2
set.inspect

Beachten Sie, dass wir im Falle von benutzerdefinierten Objekten die eql? y hash Methoden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X