Ruby 从阵列中删除类似对象
我有一个哈希数组:Ruby 从阵列中删除类似对象,ruby,arrays,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, relations
[{ 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
我想删除注释的行。需要删除所有具有共同关系_1
和值的行。我能想到的唯一办法是:
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
这不符合预期。什么是最“红宝石”的方式来删除那些有问题的项目?按{item |[item.relationship|u 1,item.value]}.values.map(&:first)
分组
更新
哎呀,这是一个杂凑:
group_by{| item |[item[:relationship_1],item[:value]}.values.map(&:first)
或
groupby{item | item.values_at(:relationship_1,:value)}.values.map(&:first)
不幸的是,在Ruby core中不可用。使用require'activesupport'
将其拉入
items.uniq_by {|h| [h[:replationship_1], h[:value]] }
编辑:正如下面@mu所指出的,Ruby 1.9也可以工作:
items.uniq{|h| [h[:replationship_1], h[:value]] }
也许函数会有帮助。我发现在本文中提到了它,如果我没有错的话,它是最新RubyonRails的一部分
a.uniq_by {|t| [t.replationship_1, t.value]}
你如何定义“相似”?也请阅读。它们是不一样的。在本例中,我的意思是拥有一组相等的特定值,在标题中没有更好的表达方式。幸运的是,我使用的是Rails 3。如果它不需要的话,我不想要额外的要求。鉴于这些对象是ActiveResource对象,这将非常有效。非常感谢。他(我认为)实际上相当聪明,值得一看。胡说八道。1.9可以占用一个块,Array 35; uniq
当然是在核心中。@muistooshort我想是的,但是当我查看文档时,我很惊讶,方法的签名没有说明它占用一个块,所以我甚至懒得看示例。(谢天谢地,此文档问题已在中解决。)@muistooshort良好呼叫。我不知道。为什么item.relationship\u 1
在我的ruby 1.9.2安装中不起作用?我必须使项[:relationship\u 1]
起作用。