如何使用带有独特对的哈希值的.uniq?

时间:2016-09-21 18:19:30

标签: ruby

假设我有一个包含多个电子邮件和名称哈希的数组。例如,我有这样的事情:

foo = [{id: 1, name: 'Eric Cartman', email: 'eric@southpark.com'},
       {id: 2, name: 'Eric Cartman', email: 'cartmanfamily@gmail.com'},
       {id: 3, name: "Cartman's mom", email: 'cartmanfamily@gmail.com'},
       {id: 4, name: 'Eric Cartman', email: 'eric@southpark.com'}]

如何根据名称和电子邮件的组合使用.uniq返回唯一值?例如,我想返回这样的内容:

[{id: 1, name: 'Eric Cartman', email: 'eric@southpark.com'},
{id: 2, name: 'Eric Cartman', email: 'cartmanfamily@gmail.com'},
{id: 3, name: "Cartman's mom", email: 'cartmanfamily@gmail.com'}]

2 个答案:

答案 0 :(得分:2)

foo.uniq应该可以正常工作。 从那以后

{name: "cartman", email: "cartman@sp.com"} == {name: "cartman", email: "cartman@sp.com"} # => True
{name: "stan", email: "stan@sp.com"} == {name: "cartman", email: "cartman@sp.com"} # => False

==运算符检查散列的每个字段是否具有相同的值。因此,.uniq将按您希望的方式运作!

如果只有电子邮件和名称字段,则应使用带有块的uniq方法:

foo.uniq { |x| [x[:name], x[:email]] }

它只会保留名称和电子邮件的uniq组合。

希望它有所帮助,快乐的红宝石编码!

答案 1 :(得分:1)

Array#uniq需要阻止:

foo = [{id: 1, name: 'Eric Cartman', email: 'eric@southpark.com'},
       {id: 2, name: 'Eric Cartman', email: 'cartmanfamily@gmail.com'},
       {id: 3, name: "Cartman's mom", email: 'cartmanfamily@gmail.com'},
       {id: 4, name: 'Eric Cartman', email: 'eric@southpark.com'}]

bar = foo.uniq {|h| [h[:name], h[:email]] }

bar == [{id: 1, name: 'Eric Cartman', email: 'eric@southpark.com'},
        {id: 2, name: 'Eric Cartman', email: 'cartmanfamily@gmail.com'},
        {id: 3, name: "Cartman's mom", email: 'cartmanfamily@gmail.com'}] #=> true

根据文档,“如果给出了一个块,它将使用块的返回值进行比较。”