从哈希数组中删除除一个副本之外的所有副本

时间:2014-04-25 20:15:17

标签: ruby arrays

我有一系列像这样的哈希:

[
  { :color => 'red', :animal => 'dog' },
  { :color => 'blue', :animal => 'cat' },
  { :color => 'yellow', :animal => 'frog' },
  { :color => 'red', :animal => 'cat' },
  { :color => 'red', :animal => 'mouse' }
]

我想要做的是根据其中一个键删除除一个重复项之外的所有重复项。

因此,在这种情况下,我想删除colorred的所有项目。无论哪一个。

最终输出将是这样的:

[
  { :color => 'blue', :animal => 'cat' },
  { :color => 'yellow', :animal => 'frog' },
  { :color => 'red', :animal => 'mouse' }
]

同样,在删除重复项时,要保留的副本无关紧要。

2 个答案:

答案 0 :(得分:2)

.group_by { |x| x[:color] }.values.map(&:first)

.inject({}) { |xs, x| xs[x[:color]] = x; xs }.values

答案 1 :(得分:2)

实现这一目标的另一种方法是

.uniq { |h| h[:color] }
  

=> [{:color =>“red”,:animal =>“dog”},{:color =>“blue”,   :animal =>“cat”},{:color =>“yellow”,:animal =>“frog”}]

正如@Victor所说,这是针对ruby 1.9.2 +