在Ruby中基于多个属性从对象数组中删除重复项

4

我有一个对象数组,其中可能包含具有相同属性值的对象。 我试图根据多个属性(而不仅仅是一个属性值)删除重复项。

class Font
 attr_accessor :color, :name, :type
end

a = <@color="blue", @name="s", @type="bold">
b = <@color="blue", @name="r", @type="italic"> 
c = <@color="green", @name="t", @type="bold">
d = <@color="blue", @name="s", @type="some_other_type">

fonts = [a, b, c, d]

我需要根据颜色和名称的值来消除重复项(我不关心类型)

我尝试过的方法:

uniq_fonts = fonts.uniq { |f| f.name.to_s + f.color.to_s}

有没有更简洁的方法可以实现相同的结果?

注意:这些是对象而不是哈希。我知道我们可以使用:

fonts.uniq { |f| f.values_at(:name, :color)}

如果它们是哈希


1
为什么急于选择一个答案呢?这样做可能会阻碍其他人的回答,并且打断那些还在准备回答的人。 - Cary Swoveland
1
“a”,“b”,“c”和“d”不是有效的对象,因此读者无法在不修改您的代码的情况下进行测试。 您需要添加“def initialize(color,name,type); @color,@name,@type = color,name,type; end”,定义“a = Font(“blue”,“s”,“bold”)”以及类似于“b”,“c”和“d”的内容。 - Cary Swoveland
我是说 a = Font.new("blue", "s", "bold")... - Cary Swoveland
1个回答

14

您可以尝试:

uniq_fonts = fonts.uniq { |f| [ f.name, f.color ] }

您可以像这样定义自己的values_at方法:

class Font
  attr_accessor :color, :name, :type

  def values_at *args
    args.map { |method_name| self.public_send method_name }
  end
end

然后做如下操作:

fonts.uniq { |f| f.values_at(:name, :color)}

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