如何仅基于键从哈希数组中删除重复项?

时间:2011-04-26 23:43:48

标签: ruby hash

您将如何根据删除重复项?

values = [{"a"=>"1"}, {"a"=>"2"}, {"b"=>"1"}, {"a"=>"4"}]

如何忽略该值并根据运行uniq,以便它返回:

[{'a' => '1'}, {'b' => '1'}]

3 个答案:

答案 0 :(得分:5)

假设您不关心哪个值被破坏,只需将它们运行到哈希(它具有唯一键,因此可能是这种情况下的正确集合类):

h = {}
values.each{|i|i.each{|k,v|h[k] = v}}
puts h # => {"a"=>"4", "b"=>"1"}

...或者如果您想要每个键的第一个:

h = {}
values.each{|i|i.each{|k,v|h[k] = v unless h[k]}}

如果你想回到数组:

h.each{|k,v|a << {k=>v}}

答案 1 :(得分:2)

以下内容仅适用于ruby 1.9,因此可能没用。

Hash[values.map(&:first).reverse].map{|a| Hash[*a]}

如果您按原始顺序需要,

values & Hash[values.map(&:first).reverse].map{|a| Hash[*a]}

答案 2 :(得分:0)

在不引入任何中间变量的情况下,以下1个衬垫将起到作用:

> [{"a"=>"1"}, {"a"=>"2"}, {"b"=>"1"}, {"a"=>"4"}].inject({}) {|s,h| s.merge(h) unless s.keys.include? h.keys}.inject([]) {|s,h| s << {h[0]=>h[1]}}
 => [{"a"=>"4"}, {"b"=>"1"}]