【问题标题】:Remove duplicates from array of objects based on multiple attributes in ruby根据ruby中的多个属性从对象数组中删除重复项
【发布时间】:2016-08-10 17:54:53
【问题描述】:

我有一个对象数组,其中可能包含具有相同属性值的对象。我正在尝试基于多个属性(不仅仅是一个属性值)删除重复项

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)}

如果他们是哈希

【问题讨论】:

  • 为什么急于选择答案?您可能会阻止其他答案,并让那些仍在准备答案的人短路。
  • abcd 不是有效对象,因此读者无法在不修改代码的情况下进行测试。您需要为bcd 添加def initialize(color, name, type); @color, @name, @type = color, name, type; end、定义a = Font("blue", "s", "bold") 和类似内容。
  • 我的意思是a = Font.new("blue", "s", "bold")...

标签: arrays ruby


【解决方案1】:

你可以试试:

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)}

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2018-03-06
    • 2020-07-25
    相关资源
    最近更新 更多