根据ruby中的多个属性从对象数组中删除重复项

suj*_*jay 1 ruby arrays

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

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]
Run Code Online (Sandbox Code Playgroud)

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

我试过的

uniq_fonts = fonts.uniq { |f| f.name.to_s + f.color.to_s}
Run Code Online (Sandbox Code Playgroud)

有没有更清洁的方法可以达到相同的效果?

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

fonts.uniq { |f| f.values_at(:name, :color)}
Run Code Online (Sandbox Code Playgroud)

如果他们是哈希

Aru*_*hit 7

你可以试试:

uniq_fonts = fonts.uniq { |f| [ f.name, f.color ] }
Run Code Online (Sandbox Code Playgroud)

您可以定义自己的values_at方法,如:

class Font
  attr_accessor :color, :name, :type

  def values_at *args
    args.map { |method_name| self.public_send method_name }
  end
end
Run Code Online (Sandbox Code Playgroud)

然后做:

fonts.uniq { |f| f.values_at(:name, :color)}
Run Code Online (Sandbox Code Playgroud)