2013-08-14 38 views
6

Tôi có một mảng băm mà tôi cần tìm và lưu trữ các kết quả phù hợp dựa trên một giá trị khớp giữa các băm.Tìm giữ bản sao trong băm 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]"}] 

Vì vậy, tôi sẽ muốn quay trở lại

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

Ghi chú: tôi có thể sắp xếp dữ liệu (csv) bởi :name sau khi thực tế nên họ không cần phải được nhóm độc đáo, chỉ cần chính xác. Ngoài ra nó không cần thiết hai trong số đó, nó có thể là 3 hoặc 10 hoặc nhiều hơn.

Ngoài ra, dữ liệu là khoảng 22.000 hàng.

+0

Tôi đoán những gì tôi đang cố gắng làm là ngược lại với 'uniq! 'Nhưng tôi đã không thể tìm ra chính xác cách xử lý điều đó. – lyonsinbeta

Trả lời

14

Tôi đã thử nghiệm này và nó sẽ làm chính xác những gì bạn muốn:

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

Tuy nhiên, bạn có thể muốn xem xét một số các đối tượng trung gian sản xuất trong tính toán đó và xem đó là những hữu ích hơn cho bạn.

+1

Tôi đã thử nghiệm điều này và như bạn đã nói nó hoạt động tuyệt vời! Cảm ơn rất nhiều vì phản ứng nhanh. – lyonsinbeta

+0

Nếu bạn đang tìm kiếm thêm tín dụng, và để làm cho một người rất mệt mỏi hạnh phúc, những gì nếu tôi cần phải loại bỏ trường hợp nơi ': id' là như nhau? Có nghĩa là chỉ giữ các bản ghi trong đó ': email' giống nhau nhưng': id' thì khác. – lyonsinbeta

+0

Bằng email, bạn có nghĩa là 'tên'? Nếu hai bản ghi có cùng tên và id, thì các hash phải bằng nhau, vì vậy tôi chỉ đơn giản là đặt 'a.uniq!' Trên dòng riêng của nó phía trên mã của tôi. Hoặc bạn có thể chèn '.uniq' ngay trước' .group_by'. –

Các vấn đề liên quan