2013-08-14 7 views
6

Ho una matrice di hash in cui ho bisogno di trovare e memorizzare corrispondenze basate su un valore di corrispondenza tra gli hash.Trova mantenere i duplicati negli hash di Ruby

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]"}] 

Quindi vorrei tornare

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]"}] 

Note: posso ordinare i dati (CSV) di :name dopo il fatto in modo che non devono essere ben raggruppati, proprio accurate. Inoltre non è necessario due dello stesso, potrebbe essere 3 o 10 o più.

Inoltre, i dati sono circa 22.000 righe.

+0

Immagino che quello che sto cercando di fare sia l'opposto di "uniq!", Ma non sono stato in grado di capire esattamente come elaborarlo. – lyonsinbeta

risposta

14

Ho provato questo e farà esattamente quello che vuoi:

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

Tuttavia, si potrebbe desiderare di guardare alcuni degli oggetti intermedi prodotti in tale calcolo e vedere se queste sono più utile a voi.

+1

Ho provato questo e come hai detto funziona benissimo! Grazie mille per la risposta rapida alleggerimento. – lyonsinbeta

+0

Se stai cercando un credito extra, e per rendere felice una persona molto stanca, cosa succede se ho bisogno di rimuovere istanze dove ': id' era lo stesso? Significa mantenere solo i record dove ': email' è lo stesso ma': id' è diverso. – lyonsinbeta

+0

Per email intendi "nome"? Se due record hanno lo stesso nome e id, allora gli hash dovrebbero essere uguali, quindi dovrei semplicemente mettere "a.uniq!" Sulla sua riga sopra il mio codice. O potresti inserire '.uniq' proprio prima di' .group_by'. –