I have a hash like so:
[
{
:lname => \"Brown\",
:email => \"james@intuit.com\",
:fname => \"James\"
},
{
:lname => nil,
Ok, this (delete duplicates) is what you asked for:
a.sort_by { |e| e[:email] }.inject([]) { |m,e| m.last.nil? ? [e] : m.last[:email] == e[:email] ? m : m << e }
But I think this (merge values) is what you want:
a.sort_by { |e| e[:email] }.inject([]) { |m,e| m.last.nil? ? [e] : m.last[:email] == e[:email] ? (m.last.merge!(e) { |k,o,n| o || n }; m) : m << e }
Perhaps I'm stretching the one-liner idea a bit unreasonably, so with different formatting and a test case:
Aiko:so ross$ cat mergedups
require 'pp'
a = [{:fname=>"James", :lname=>"Brown", :email=>"james@intuit.com"},
{:fname=>nil, :lname=>nil, :email=>"brad@intuit.com"},
{:fname=>"Brad", :lname=>"Smith", :email=>"brad@intuit.com"},
{:fname=>nil, :lname=>nil, :email=>"brad@intuit.com"},
{:fname=>"Brad", :lname=>"Smith", :email=>"brad@intuit.com"},
{:fname=>"Brad", :lname=>"Smith", :email=>"brad@intuit.com"}]
pp(
a.sort_by { |e| e[:email] }.inject([]) do |m,e|
m.last.nil? ? [e] :
m.last[:email] == e[:email] ? (m.last.merge!(e) { |k,o,n| o || n }; m) :
m << e
end
)
Aiko:so ross$ ruby mergedups
[{:email=>"brad@intuit.com", :fname=>"Brad", :lname=>"Smith"},
{:email=>"james@intuit.com", :fname=>"James", :lname=>"Brown"}]