按键值唯一的哈希数组

时间:2015-07-22 08:37:38

标签: arrays ruby hash unique

好的,所以......我有一系列像这样的哈希:

[
    { :id => 0, :text => "someText" },
    { :id => 1, :text => "anotherText" },
    { :id => 2, :text => "someText" }
]

我想要的是filter哈希,删除重复的:text值,结果是:

[
    { :id => 0, :text => "someText" },
    { :id => 1, :text => "anotherText" }
]

我该怎么做?

P.S。当然,我可以找到一种方法并做到这一点。我要求的是最好的(也是最快的)Ruby友好的方式,因为我不是这样的Ruby大师。 ; - )

2 个答案:

答案 0 :(得分:3)

使用 Array#uniq

尝试此操作
arr.uniq{|h| h[:text]} # Returns a new array by removing duplicate values
 => [{:id=>0, :text=>"someText"}, {:id=>1, :text=>"anotherText"}]
# OR    
arr.uniq!{|h| h[:text]} # Removes duplicate elements from self.
=> [{:id=>0, :text=>"someText"}, {:id=>1, :text=>"anotherText"}]

有很多不同的方法可以实现您的目标,但是当您寻找最快的方式时,以下是 uniq group_by 的基准。这只是为了样本。像这样你可以测试自己不同的方法,并根据你的要求检查解决方案..

require 'benchmark'
arr = [{ :id => 0, :text => "someText" }, { :id => 1, :text => "anotherText" }, { :id => 2, :text => "someText" }]
Benchmark.bm do |x|
  x.report("group_by:")   { arr.group_by { |e| e[:text] }.values.map &:first }
  x.report("uniq:")   { arr.uniq{|h| h[:text]} }
end
# output
            user     system      total        real
group_by:  0.000000   0.000000   0.000000 (  0.000039)
uniq:      0.000000   0.000000   0.000000 (  0.000012)

答案 1 :(得分:2)

尽管uniq是解决问题的完美解决方案,但还有更灵活的方法,您可以指定从多个变体中选择的内容的附加条件:

#                                        ⇓⇓⇓⇓⇓⇓⇓
arr.group_by { |e| e[:text] }.values.map &:first

有人可能会在那里设置任何条件,只选择那些偶数为:id或其他的元素。