Как выбрать уникальное хеш-значение с еще одним условием - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть:

h = [{:a=>"Hello", :b=>false}, {:a=>"Hello", :b=>true}, {:a=>"H1", :b=>false}]

Я хочу получить уникальные значения на основе ключа a, а значение b должно быть true.Я хочу получить такой результат:

[{:a=>"Hello", :b=>true}, {:a=>"H1", :b=>false}]

Если я сделаю:

h.uniq {|hash| hash.values_at(:a)}

, то получится первый хеш uniq.Я получаю:

[{:a=>"Hello", :b=>false}, {:a=>"H1", :b=>false}]

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Наиболее эффективным подходом, вероятно, будет reduce:

h.each_with_object({}) do |h, acc|
  acc[h[:a]] = h if acc[h[:a]].nil? || !acc[h[:a]][:b]
end.values
#⇒ [{:a=>"Hello", :b=>true}, {:a=>"H1", :b=>false}]
0 голосов
/ 26 сентября 2018

Ваш вопрос не ясен.Если вы просто хотите, чтобы результат, который вы описали, это будет работать:

h.group_by { |e| e[:a] }
 .map { |k, values| values.find { |e| e[:b] == true } || values.first }
#=> [{:a=>"Hello", :b=>true}, {:a=>"H1", :b=>false}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...