2015-01-13 3 views
-1

Можете ли вы дать мне разрешение ниже:Удаление повторяющихся записей в хэш хэш

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

Ожидаемый результат: Тиражирование во всех областях должны быть удалены

{ 
    "a"=>{"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"} 
} 
+0

Какой ключ удален? Почему «b» удаляется, а не «a»? – sawa

ответ

1

Вы можете написать

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.to_a 
     .uniq { |_, hash| hash.values_at('unit_id', 'dep_id', '_destroy') } 
     .to_h 
# => {"a"=>{"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#values достаточно.

+0

Но что, если ключи разные? –

+0

@JikkuJose Не предполагайте. Я ответил в соответствии с _data_, данным OP. Это ответственность ОП ... Во всяком случае, я исправил. Но может быть несколько вещей, которые невозможно принять. Мы отвечаем на основании того, что мы видим на этом посту. –

+0

Хорошо, да! Не следует принимать и решать минимальные требования. –

3

Вы могли бы сделать

hash_list.invert.invert 

Hash#invert создает новый хеш, где значения старой хеш-ключи нового хэша, который удалит все повторяющиеся значения старого хэш. Второй звонок invert сворачивает назад.

Это не дает вам никакого контроля над тем, какая из ключей для дубликатов значений удалена.

+0

Это красиво. – sawa

0

Можно также написать следующее, но решение Фридриха явно один использовать:

Hash[hash_list.group_by { |_,v| v }.map { |_,v| v.first }] 
    #=> {"a"=>{"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"}} 

Для Руби 1.9+ это будет держать первый ключ-значение пары k=>v среди всех пар ключ-значение со значением v.

Смежные вопросы