Ruby:遍历一个对象数组,忽略具有重复属性的项

4
我有一个 Ruby 对象数组,我想要遍历它,忽略已经处理过的名称。例如:
[
  #<Item name: "Item 1", content: "a">,
  #<Item name: "Item 1", content: "b">,
  #<Item name: "Item 2", content: "c">,
  #<Item name: "Item 3", content: "d">,
  #<Item name: "Item 3", content: "e">
]

应该减少为:
[
  #<Item name: "Item 1">, # Should know that it belongs to content: "a" and "b"
  #<Item name: "Item 2">, # Should know that it belongs to content "c"
  #<Item name: "Item 3">  # Should know that it belongs to content: "d" and "e"
]

一种可能的(但不良)解决方案:
processed = []
items.each do |item|
  next if processed.include?(item.name)
  processed << item.name
  # Output ...

这对我来说似乎不是很直接,所以我在寻找替代方案。另一种解决方案是将所有内容存储在哈希表中,并使用名称作为索引。但这需要迭代两次,也不是最优雅的解决方案。如果有人有想法如何优雅地迭代的话那就太棒了。
顺祝商祺,塞巴斯蒂安
PS:我刚意识到所有具有相同名称属性的其他项目实际上都必须已知于正在处理的项目。因此,我的解决方案甚至无法解决这个问题。 :-(

具有相同名称的对象,它们是相同的对象吗?还是它们在某些其他属性上不同? - Dogbert
我省略了属性以获得简单性。对此表示抱歉,可能会被误解。我只是添加了一些属性,使其更易理解。 - YMMD
2个回答

9

试试这个:

array.group_by(&:name).map{|k, v| v.first}

这太棒了!我放弃了映射,因为(根据我的附录)我需要与同名其他项目的引用。但这正是我所需要的。非常感谢你!(: - YMMD

2
a = [ "a", "a", "b", "b", "c" ]
a.uniq   #=> ["a", "b", "c"]

1
这个解决方案不够充分,因为我的数组中的对象具有比名称更多的属性。出于简单起见,我只是省略了它们。我编辑了我的帖子,以便您可以更好地看到它。如果我可以指定一个参数来唯一确定对象内部应使用哪个属性,那么它就会适合。 - YMMD

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