Ruby on rails 如何基于值从哈希中删除重复项

Ruby on rails 如何基于值从哈希中删除重复项,ruby-on-rails,ruby,hash,Ruby On Rails,Ruby,Hash,我有一个重复条目的列表。我需要一个基于单位id的唯一条目列表 hash_list = { "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_

我有一个重复条目的列表。我需要一个基于单位id的唯一条目列表

hash_list = {
  "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}
}
预期产出:

hash_list = {
  "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}
}
但请注意,重复项仅基于密钥单元id删除。 要基于多个键执行此操作

hash_list.to_a
         .uniq! { |_, v| v.values_at('unit_id','_destroy') }
         .to_h
请看一看

输出

但请注意,重复项仅基于密钥单元id删除。 要基于多个键执行此操作

hash_list.to_a
         .uniq! { |_, v| v.values_at('unit_id','_destroy') }
         .to_h
请看一看

输出


下面是一种不将哈希转换为数组的方法,修改数组,然后将修改后的数组转换回哈希:

require 'set'

s = Set.new
hash_list.select { |_,h| s.add?(h["unit_id"]) }
  #=> {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  #    "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}} 

下面是一种不将哈希转换为数组的方法,修改数组,然后将修改后的数组转换回哈希:

require 'set'

s = Set.new
hash_list.select { |_,h| s.add?(h["unit_id"]) }
  #=> {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"},
  #    "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}} 

它可能来自您的嵌套属性。你可以把它放在表格里。。为什么要使用此手册。它可能来自您的嵌套属性。你可以把它放在表格里。。为什么这是手动操作?很好的解决方案。uniq!避免创建另一个数组,可能会快一点。谢谢。我如何将“_destroy”也包括在该检查中。我有以下列表:hash_list={a=>{unit_id=>43,dep_id=>153,{destroy=>false},b=>{unit_id=>43,dep_id=>153,{u destroy=>1},c=>{unit id=>43,dep_id=>154,dep destroy=>false},d=>unit id=>42,dep_id=>154,dep=>154,{destroy=>false},需要的结果是:unit id=>153,dep=>{unit_id=>43,dep_id=>153,{u destroy=>1},d=>{unit_id=>42,dep_id=>154,{u destroy=>false}。请帮助NICE解决方案。uniq!避免创建另一个数组,可能会快一点。谢谢。我如何将“\u destroy”也包括在这个检查中。我有以下列表:hash_list={a=>2009年,b=>{{单位(U U U U U U U U U U U U U U U U U U U U U U U U U U id=>43,dep U U U U U U U U U U U U U U U U U U U U U U U id=>>1},c=>43,c=>43,43,dep U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U id=>0.I=>0.I=>0{>0.1}>43,c=>43,c=>43,c=>43,c=>43,c=>43,c=>43,deU U U U U U U U U U U U id=>id=>id=>43,deU U id=>43,deU U U id=>43,deU U id=>id=>43,deU U U id=>id=>43,deU U id=},d=>{unit_id=>42,dep_id=>154,{u destroy=>false}。请帮助