Как удалить дубликаты из массива хэшей только по ключам? - PullRequest
1 голос
/ 27 апреля 2011

Как бы вы удалили дубликаты на основе клавиши ?

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

Как можно проигнорировать значение и запустить uniq на основе ключ , чтобы он возвратил:

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

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

Предполагая, что вам все равно, какое значение будет утеряно, просто запустите их в хеш (который имеет уникальные ключи и, следовательно, вероятно, является правильным классом сбора для этого случая):

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 голосов
/ 27 апреля 2011

Следующее будет работать только в ruby ​​1.9, поэтому оно может быть бесполезным.

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

Если вам нужно в исходном порядке,

values & Hash[values.map(&:first).reverse].map{|a| Hash[*a]}
0 голосов
/ 27 апреля 2011

Без введения каких-либо промежуточных переменных следующий 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"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...