2015-06-08 85 views
1

我有一个包含重复条目的列表。我需要一个基于unit_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"} 
} 
+0

可能它来自您的嵌套属性。你可以在'form_for'里修改它。为什么这个手册能够工作。 –

回答

5
hash_list.to_a 
     .uniq! { |_, v| v['unit_id'] } 
     .to_h 

不过需要注意的是,副本中仅删除基于密钥unit_id
要做到这一点基于多个键,

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

请看看Hash#values_at

输出

>> hash_list = { "a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"1"}, "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"} } 
#=> {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"1"}, "c"=>{"unit_id"=>"43", "dep_id"=>"154", "_destroy"=>"false"}, "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}} 
>> hash_list.to_a.uniq! { |_, v| v.values_at('unit_id','_destroy') }.to_h 
#=> {"a"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"false"}, "b"=>{"unit_id"=>"43", "dep_id"=>"153", "_destroy"=>"1"}, "d"=>{"unit_id"=>"42", "dep_id"=>"154", "_destroy"=>"false"}} 
+0

不错的解决方案。 'uniq!'避免了另一个阵列的创建,并且可能快一点点。 –

+0

谢谢。我怎么能包括'_destroy'也到这个检查。我有以下列表:hash_list = { “a”=> {“unit_id”=>“43”,“dep_id”=>“153”,“_destroy”=>“false”}, “b”=> {“unit_id”=>“43”,“dep_id”=>“153”,“_destroy”=>“1”}, “c”=> {“unit_id”=>“43”,“dep_id”=> “154”,“_destroy”=>“false”}, “d”=> {“unit_id”=>“42”,“dep_id”=>“154”,“_destroy”=>并且需要结果为:“a”=> {“unit_id”=>“43”,“dep_id”=>“153”,“_destroy”=>“false”},“b”=> {“unit_id” >“43”,“dep_id”=>“153”,“_destroy”=>“1”},“d”=> {“unit_id”=>“42”,“dep_id”=>“154”,“_destroy “=>” 假“}。请帮忙 – jissy

+0

@jissy我已经更新了答案! – BinaryMee

1

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

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