2015-06-08 3 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» => «false»} } и нужен результат как: "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"}} 
Смежные вопросы