2011-08-08 7 views
4

私はRubyにオブジェクトの配列を持っていますが、すでに処理されている名前を持つすべてのオブジェクトを無視して反復処理します。例えば:これは私には非常にまっすぐ進むとは思えないので、私は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" 
] 

可能(ただし、厄介な)の溶液に減少させるべきです代替案を探しています。もう1つの解決策は、すべてをハッシュに格納し、その名前をインデックスとして使用することです。しかし、それは2回反復する必要があり、また最も洗練された解決策ではないようです。誰かがエレガントに反復する方法を知っていれば素晴らしいだろう。

種類よろしく、セバスチャン

PS:私はちょうど同じname属性を持つ他のすべての項目は、実際に処理アイテムに知らなければならないことに気づきました。だから私の解決策はそれでは機能しません。 :-(

+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

このソリューションは、配列内のオブジェクトに名前の属性が多く、単純な理由からそれらを残しているため、十分ではありません。私はあなたがそれをより良く見ることができるように私の投稿を編集しました。使用すべきである。 – YMMD

関連する問題