如何在另一个条件下选择uniq哈希值

时间:2018-09-26 09:32:27

标签: ruby

我有:

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 :(得分:3)

您的问题不清楚。如果您只想要您描述的结果,那么它将起作用:

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

答案 1 :(得分:0)

最有效的方法可能是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}]