如何获取Ruby数组中每个重复type对应的首个对象实例?
解决方案
步骤1:统计各:type的出现频次
先通过group_by按:type对数组元素分组,再用transform_values计算每组的元素数量,得到每个type的出现次数:
type_counts = array.group_by { |item| item[:type] }.transform_values(&:size) # 结果:{"Staff"=>2, "Guard"=>2, "Office boy"=>1}
步骤2:筛选出重复的:type
从统计结果中过滤出出现次数大于1的type:
duplicate_types = type_counts.select { |_, count| count > 1 }.keys # 结果:["Staff", "Guard"]
步骤3:获取每个重复:type的首个实例
遍历筛选出的重复type,用find从原数组中取出第一个匹配该type的元素:
result = duplicate_types.map { |type| array.find { |item| item[:type] == type } }
完整代码
array = [ {:id=>433, :name=>"test 1", :type=>"Staff"}, {:id=>434, :name=>"test 2", :type=>"Guard"}, {:id=>435, :name=>"test 3", :type=>"Office boy"}, {:id=>471, :name=>"test 1", :type=>"Staff"}, {:id=>473, :name=>"test 2", :type=>"Guard"} ] type_counts = array.group_by { |i| i[:type] }.transform_values(&:size) duplicate_types = type_counts.select { |_, cnt| cnt > 1 }.keys result = duplicate_types.map { |t| array.find { |i| i[:type] == t } } p result # 输出: # [{:id=>433, :name=>"test 1", :type=>"Staff"}, {:id=>434, :name=>"test 2", :type=>"Guard"}]
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

