ハッシュの配列があり、そこから一意の値が必要です。電話をかけ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
編集:私が現実の世界でこれに遭遇したところ、ハッシュは少し複雑でした。それらは、複数のフィールドを持つ解析されたJSONの結果であり、その一部の値もハッシュでした。一意の値を除外したい結果の配列がありました。
Hash.eql?
再定義とHash.hash
ソリューションは好きではありませんHash
。グローバルに再定義するか、配列のエントリごとに再定義する必要があるためです。各エントリの定義を変更するのはHash
面倒です。特に、各エントリ内にネストされたハッシュがある場合があるためです。
Hash
特に一時的に行われた場合、グローバルに変化する可能性があります。古い定義を保存して復元することをラップした別のクラスまたはヘルパー関数を作成したいのですが、これにより、実際に必要とされるよりも複雑になると思います。
を使用inject
することは、を再定義するための良い代替手段のようHash
です。