2011-08-08 66 views
4

我有一個ruby對象數組,我想遍歷它,忽略每個對象,它的名字已經被處理。例如: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

具有相同名稱的對象,相同的對象還是他們在一些其他財產不同 – Dogbert

+0

我離開的屬性了,以獲得?簡單,對不起,這可能是錯誤的,我只是添加了一些屬性,使其更容易理解 – YMMD

回答

9

試試這個:

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

這太棒了!因爲(正如我在附錄中看到的),我需要引用其他具有相同名稱的項目。但這正是我所需要的。非常感謝你! (: – YMMD

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

這個解決方案是不夠的,因爲我的數組中的對象確實有更多的屬性,然後是一個名稱。我編輯了我的帖子,以便你可以更好地看到它。如果我可以指定一個參數來唯一確定obj中的哪個屬性,那就適合了等它應該使用。 – YMMD