2013-03-23 251 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