Rails: Remove element from array of hashes

26,078

Solution 1

I think you're looking for this:

filtered_array = array.reject { |h| blacklist.include? h['email'] }

or if you want to use select instead of reject (perhaps you don't want to hurt anyone's feelings):

filtered_array = array.select { |h| !blacklist.include? h['email'] }

Your

array.select {|k,v| ...

attempt won't work because array hands the Enumerable blocks a single element and that element will be a Hash in this case, the |k,v| trick would work if array had two element arrays as elements though.

Solution 2

How about

array.delete_if {|key, value| value == "[email protected]" } 
Share:
26,078

Related videos on Youtube

MorningHacker
Author by

MorningHacker

Updated on March 08, 2020

Comments

  • MorningHacker
    MorningHacker about 4 years

    I have the following array:

     array = [{"email"=>"[email protected]", "name"=>"Test"},
              {"email"=>"[email protected]", "name"=>"Test A"},
              {"name"=>"Test B", "email"=>"[email protected]"},
              {"email"=>"[email protected]", "name"=>"Test C"},
              {"name"=>"Test D", "email"=>"[email protected]"},
              {"email"=>"[email protected]"},
              {"name"=>"Test F", "email"=>"[email protected]"}]
    

    I have a list of "blacklist" emails, for instance:

     blacklist = ["[email protected]"]
    

    I want to do something like this:

     array - blacklist 
     # => should remove element {"email"=>"[email protected]", "name"=>"Test C"} 
    

    Surely there is a sexy-Ruby way to do this with .select or something, but I haven't been able to figure it out. I tried this to no avail:

     array.select {|k,v| v != "[email protected]"} # => returns array without any changes
    
  • MorningHacker
    MorningHacker over 12 years
    brilliant! thanks for the quick turnaround :) in fact, you answered so quickly that I can't even "accept" the answer on SO's system.
  • PeterWong
    PeterWong over 12 years
    similar to @mu is too short's select, it should be array.delete_if {|hash| hash["email"] == "[email protected]"}
  • tokland
    tokland over 12 years
    delete_if works inplace (usually not a good idea), the OP seems to want a new array.
  • Darren Cato
    Darren Cato over 11 years
    there is also an exclude function that is and alias for !include
  • mu is too short
    mu is too short over 11 years
    @Darren: The only downside is that exclude? is a Rails extension and that would lead into double negative territory :) I'd probably go with the reject/include?.