假设我有一个包含多个电子邮件和名称哈希的数组。例如,我有这样的事情:
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'}]
答案 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
根据文档,“如果给出了一个块,它将使用块的返回值进行比较。”