从Ruby数组中删除重复对象

5

使用传统的Ruby方法无法从下面的数组user_list中删除所有重复的对象,我无法达到期望的结果。是否有更聪明的方法来解决这个问题?

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 应该是可以正常工作的。你能展示一下测试的步骤和结果吗?用户数组中对象的类别是什么,它们的 == 操作符是如何定义的?这是 Ruby on Rails 吗? - David Grayson
你使用的是 Rails 4 还是 Rails 3?噢,对了,你是否在使用 Rails?如果不是,那 User 类从哪里来的? - nzifnab
2
大家好,这只是一个误报!我使用了错误格式的数据调用了该方法。users.uniq确实可以工作!感谢你们的帮助。 - user2041343
4个回答

12

这个怎么样?

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

这样做还有一个额外的好处,即只需进行一次数据库调用,而不是 user_list.size 次调用。


这比他目前所做的要高效得多。也可以使用 User.where(user_id: user_list.map(&:user_id)),它将惰性执行数据库查询,并自动处理唯一性。 - nzifnab

7
user_list.uniq! 

这段代码将会移除所有重复的值,只保留user_list中的唯一值。

希望我的翻译符合您的要求。


0

你也可以使用compact函数来移除nil对象,如下:

MainMenu.first.second_sale_elements.each.map(&:sale_structure).compact.uniq

0

user_list.uniq! 已经生效,但请记住,如果没有重复项出现,uniq! 将返回一个 nil 对象,因此如果您没有验证器,请使用 uniq,因为它将返回一个新数组。

Ruby 的 uniq! 文档

如果没有更改(即未找到重复项),则返回 nil。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接