2013-11-05 67 views
5

Tôi không thể đạt được kết quả mong muốn với các phương thức Ruby thông thường để loại bỏ tất cả các đối tượng trùng lặp khỏi mảng, user_list, bên dưới. Có cách nào thông minh để giải quyết vấn đề này không?Ruby loại bỏ các đối tượng trùng lặp khỏi mảng

users = [] 
user_list.each do |u| 
    user = User.find_by_id(u.user_id) 
    users << user 
    #users << user unless users.include?(user)  # does not work 
end 
#users = users.uniq  # does not work 
+2

'uniq' thực sự nên làm việc. Bạn có thể hiển thị các bước bạn đã thực hiện để kiểm tra và kết quả của bạn không? Lớp của các đối tượng trong mảng của người dùng là gì và toán tử '==' được định nghĩa như thế nào? Đây có phải là Ruby on Rails không? –

+0

Bạn đang sử dụng 'Rails 4' hoặc' Rails 3'? Oh phải, bạn đang sử dụng đường ray ở tất cả? Nếu không, lớp 'User' là gì? – nzifnab

+2

Xin chào các bạn, đây là một báo động giả! Tôi đã gọi phương thức với dữ liệu ở định dạng sai. users.uniq thực sự đang hoạt động! Cảm ơn bạn đã giúp đỡ. – user2041343

Trả lời

9

Làm thế nào về điều này?

users = User.find(user_list.map(&:user_id).uniq) 

Điều này có lợi ích bổ sung khi là một cuộc gọi cơ sở dữ liệu thay vì user_list.size cuộc gọi cơ sở dữ liệu.

+0

Điều này hiệu quả hơn nhiều so với những gì anh ta hiện đang làm. Cũng có thể thực hiện 'User.where (user_id: user_list.map (&: user_id))' sẽ thực thi một cách lười biếng truy vấn cơ sở dữ liệu và xử lý uniq một cách tự động. – nzifnab

5
user_list.uniq! 

Điều này sẽ loại bỏ tất cả giá trị trùng lặp và giữ lại giá trị duy nhất trong user_list. Tôi hy vọng đây là những gì bạn đang tìm kiếm.

0

Bạn cũng có thể sử dụng nhỏ gọn để loại bỏ nil đối tượng như

MainMenu.first.second_sale_elements.each.map(&:sale_structure).compact.uniq 
Các vấn đề liên quan