2013-03-23 239 views
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字段中的重複項。我怎樣才能做到這一點?

+1

http://stackoverflow.com/a/5208395 – 2013-03-23 17:17:43

+0

這些不是散列,而是它們看起來像來自查詢的ActiveRecord結果。你不能使用AR查詢來查找唯一/獨特的值嗎? – 2013-03-23 18:32:52

回答

0

假設你可以從ArtLookup這樣一個實例art檢索ARL_DISPLAY_NR領域:

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 

但是,它並不能保證保持原有ORD呃在前面的數組中。

0

這不是一個散列意味着什麼,你可能最終會有一個O(n)複雜性來完成。要求做到這一點可能表明您的模型中存在設計問題。

這就是說,你可以使用類似:

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

,以獲得獨特的價值。

{ 「VAL1」=>:repkey, 「值2」=>:鍵2, 「VAL3」=>:KEY3}

+0

給出代碼,模型一切正常!這是類似測試的應用程序 – 2013-03-23 17:04:29