2011-04-26 57 views
1

如何去除基于的重复项?如何从基于键的散列数组中删除重复项?

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

我怎么能忽略的价值和基于关键运行uniq使其返回:

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

@sawa运行1.8.7我** irb **接受他们就好了,但我更新了帖子,以减少混淆。 – Marco 2011-04-27 00:27:07

+1

好的,对不起。你的猜测是对的。我正在使用ruby1.9.2。 – sawa 2011-04-27 00:43:12

回答

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}} 
2

下面的工作只能在Ruby 1.9的,所以它可能是无用的。

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

如果你需要在原来的顺序,

values & Hash[values.map(&:first).reverse].map{|a| Hash[*a]} 
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"}]