我有:
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}]
答案 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}]