У меня есть массив хэшей, и я хочу получить из него уникальные значения. Звонок Array.uniq
не дает мне того, чего я ожидаю.
a = [{:a => 1},{:a => 2}, {:a => 1}]
a.uniq # => [{:a => 1}, {:a => 2}, {:a => 1}]
Где я ожидал:
[{:a => 1}, {:a => 2}]
При поиске в сети я не нашел решения, которое меня порадовало. Люди рекомендовали переопределить Hash.eql?
и Hash.hash
, поскольку именно это Array.uniq
запрашивает.
Edit:
Где я столкнулся с этим в реальном мире, хэши были немного более сложными. Они были результатом анализа JSON с несколькими полями, некоторые из которых также были хешами. У меня был массив тех результатов, которые я хотел отфильтровать по уникальным значениям.
Мне не нравится решение переопределить Hash.eql?
и Hash.hash
, потому что мне придется либо переопределить Hash
глобально, либо переопределить его для каждой записи в моем массиве. Изменение определения Hash
для каждой записи было бы обременительным, тем более что внутри каждой записи могут быть вложенные хэши.
Глобальное изменение Hash
имеет некоторый потенциал, особенно если это было сделано временно. Я хотел бы создать другой класс или вспомогательную функцию, которая обернута, сохраняя старые определения и восстанавливая их, но я думаю, что это добавляет больше сложности, чем действительно необходимо.
Использование inject
кажется хорошей альтернативой переопределению Hash
.