0

私は次のような配列を持っています:

[
  #<ArtLookup ARL_ART_ID: 1248525, ARL_SEARCH_NUMBER: "4502696", ARL_KIND: 3, ARL_BRA_ID: 569, ARL_DISPLAY_NR: "4502696", ARL_DISPLAY: nil, ARL_BLOCK: 1, ARL_SORT: 1>, 
  #<ArtLookup ARL_ART_ID: 1248525, ARL_SEARCH_NUMBER: "5009285", ARL_KIND: 3, ARL_BRA_ID: 525, ARL_DISPLAY_NR: "5009285", ARL_DISPLAY: nil, ARL_BLOCK: 1, ARL_SORT: 1>,
  #<ArtLookup ARL_ART_ID: 1248525, ARL_SEARCH_NUMBER: "5016786", ARL_KIND: 3, ARL_BRA_ID: 525, ARL_DISPLAY_NR: "5016786", ARL_DISPLAY: nil, ARL_BLOCK: 2, ARL_SORT: 1>,
  ...
]

このハッシュの配列から重複する値を削除するにはどうすればよいですか?

arr.uniq私を助けませんでした。

フィールドごとに重複を削除する必要がありARL_DISPLAY_NR ます。これどうやってするの?

4

2 に答える 2

0

これは、ハッシュが使用されることを意図したものではありませんO(n)。それを達成するには複雑になる可能性があります。これを行う必要があるということは、モデルに設計上の問題があることを示している可能性があります。

つまり、次のようなものを使用できます。

hash = {key1: 'val1', key2: 'val2', key3: 'val3', repkey: 'val1'}
uniquevalues = {}
hash.each do |key, value|
  uniquevalues[value] = key
end

一意の値を取得します。

{"val1"=>:repkey, "val2"=>:key2, "val3"=>:key3}

于 2013-03-23T17:02:09.527 に答える
0

次のようなARL_DISPLAY_NRインスタンスからフィールドを取得できるとします。artArtLookup

art[:ARL_DISPLAY_NR]

ARL_DISPLAY_NR次に、次の方法でフィールドに従って重複を削除できます。

hash_array = [ artLookup_foo, artLookup_bar, ... ]

# this will keep the last one in a group of duplicates
Hash[ hash_array.map{|h| [h[:ARL_DISPLAY_NR], h]} ].values

# or keep the first one
Hash[ hash_array.reverse.map{|h| [h[:ARL_DISPLAY_NR], h]} ].values

ただし、前の配列で元の順序が維持されることは保証されません。

于 2013-03-23T17:15:24.283 に答える