【发布时间】:2010-09-15 21:59:32
【问题描述】:
我有一个哈希数组,我想要其中的唯一值。致电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 的好选择。
【问题讨论】: