从数组中删除类似的对象

时间:2012-03-13 17:51:30

标签: ruby arrays

我有一系列哈希:

[{ item_id: 1, relationship_1: 1, relationship_2: 1, value: 'go' },
 { item_id: 2, relationship_1: 2, relationship_2: 2, value: 'stop' },
 { item_id: 3, relationship_1: 2, relationship_2: 1, value: 'stop' }, #remove
 { item_id: 4, relationship_1: 3, relationship_2: 1, value: 'go' },
 { item_id: 5, relationship_1: 1, relationship_2: 2, value: 'go' }] #remove

我希望删除评论的行。需要删除所有共有relationship_1value的行。我能想到的唯一方法是:

items.each do |i|
  items.each do |k|
    if i.item_id != k.item_id and i.relationship_1 == k.relationship_1 and i.value == k.value
      items.remove(k)
    end
  end
end

这不符合预期。删除那些有害物品的最“红宝石”方式是什么?

3 个答案:

答案 0 :(得分:3)

group_by{ |item| [item.relationship_1, item.value] }.values.map(&:first)

<强>更新

哎呀,这是一个哈希:

group_by{ |item| [item[:relationship_1], item[:value]] }.values.map(&:first)

group_by{ |item| item.values_at(:relationship_1, :value) }.values.map(&:first)

答案 1 :(得分:3)

不幸的是,Ruby核心中没有uniq_by。使用require 'activesupport'将其拉入。

items.uniq_by {|h| [h[:replationship_1], h[:value]] }

编辑:如下面@mu所述,Ruby 1.9的uniq也有效:

items.uniq{|h| [h[:replationship_1], h[:value]] }

答案 2 :(得分:1)

也许this功能会有所帮助。我发现它在thread中提到过,如果我没有错,它就是铁轨上最新红宝石的一部分。

a.uniq_by {|t| [t.replationship_1, t.value]}