2013-08-14 11 views
6

Ich habe ein Array von Hashes, wo ich Übereinstimmungen basierend auf einem übereinstimmenden Wert zwischen den Hashes suchen und speichern muss.Suchen Sie doppelte in Ruby-Hashes

a = [{:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 2, :name => "Paul", :email => "[email protected]"}, 
    {:id => 3, :name => "Tom", :email => "[email protected]"}, 
    {:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 5, :name => "Tom", :email => "[email protected]"}, 
    {:id => 6, :name => "Jim", :email => "[email protected]"}] 

So würde ich

b = [{:id => 1, :name => "Jim", :email => "[email protected]"}, 
    {:id => 3, :name => "Tom", :email => "[email protected]"}, 
    {:id => 5, :name => "Tom", :email => "[email protected]"}, 
    {:id => 6, :name => "Jim", :email => "[email protected]"}] 

Hinweise zurückkehren will: ich die Daten sortieren kann (CSV) von :name nach der Tat, damit sie nicht schön gruppiert werden müssen, nur genau. Es sind auch nicht zwei gleich, es könnten 3 oder 10 oder mehr sein.

Auch die Daten sind etwa 22.000 Zeilen.

+0

Ich denke, was ich versuche, ist das Gegenteil von 'uniq!', Aber ich konnte nicht genau herausfinden, wie das zu verarbeiten ist. – lyonsinbeta

Antwort

14

Getestet habe ich diese und es wird genau das tun, was Sie wollen:

b = a.group_by { |h| h[:name] }.values.select { |a| a.size > 1 }.flatten 

Allerdings möchten Sie vielleicht auf einige der Zwischen-Objekte in dieser Berechnung erzeugt und sehen, ob diejenigen, Ihnen mehr nützlich sind.

+1

Ich habe das getestet und wie du gesagt hast funktioniert es super! Vielen Dank für die blitzschnelle Antwort. – lyonsinbeta

+0

Wenn Sie nach einem zusätzlichen Kredit suchen und eine sehr müde Person glücklich machen wollen, was ist, wenn ich Instanzen entfernen muss, bei denen ': id' gleich ist? Bedeutet, dass nur Datensätze gespeichert werden, bei denen ': email' gleich ist, aber': id' anders ist. – lyonsinbeta

+0

Per E-Mail meinst du 'name'? Wenn zwei Datensätze denselben Namen und dieselbe ID haben, dann sollten die Hashwerte gleich sein, also würde ich einfach "a.uniq!" In eine eigene Zeile über meinem Code setzen. Oder Sie könnten '.uniq' direkt vor' .group_by' einfügen. –

Verwandte Themen