2011-08-08 5 views
4

나는 루비에 객체 배열을 가지고 있으며, 이미 처리 된 이름을 가진 모든 객체를 무시하면서 반복하고 싶습니다. 예를 들어 : 이것은 나에게 매우 정직하지 않는 것 때문에 난Ruby : 객체 배열을 반복하고 중복 속성이있는 항목을 무시합니다.

processed = [] 
items.each do |item| 
    next if processed.include?(item.name) 
    processed << item.name 
    # Output ... 

:

[ 
    #<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" 
] 

에 가능한 (그러나 불쾌한) 솔루션을 줄여야한다 대안을 찾고 있습니다. 또 다른 솔루션은 모든 것을 해시에 저장하고 이름을 색인으로 사용하는 것입니다. 그러나 그것은 두 번 반복하는 것을 요구할 것이고 또한 가장 우아한 해결책 인 것처럼 보이지 않습니다. 누군가가 우아하게 반복하는 방법을 알고 있다면 그것은 대단 할 것입니다.

친절 감사, 세바스찬

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

관련 문제