我在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 :我刚刚意识到所有其他具有相同名称属性的项目必须为实际处理的项目所知。所以我的解决方案甚至不会起作用。 : - (
答案 0 :(得分:9)
试试这个:
array.group_by(&:name).map{|k, v| v.first}
答案 1 :(得分:2)
a = [ "a", "a", "b", "b", "c" ]
a.uniq #=> ["a", "b", "c"]