Mor*_*ker 23 ruby arrays hash ruby-on-rails
我有以下数组:
 array = [{"email"=>"test@test.com", "name"=>"Test"},
          {"email"=>"testA@test.com", "name"=>"Test A"},
          {"name"=>"Test B", "email"=>"testB@test.com"},
          {"email"=>"testC@test.com", "name"=>"Test C"},
          {"name"=>"Test D", "email"=>"testD@test.com"},
          {"email"=>"testE@test.com"},
          {"name"=>"Test F", "email"=>"testF@test.com"}]
Run Code Online (Sandbox Code Playgroud)
我有一个"黑名单"电子邮件列表,例如:
 blacklist = ["testC@test.com"]
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
 array - blacklist 
 # => should remove element {"email"=>"testC@test.com", "name"=>"Test C"} 
Run Code Online (Sandbox Code Playgroud)
当然有一种性感的Ruby方式可以用.select或者其他东西来做到这一点,但是我无法弄明白.我试过这个无济于事:
 array.select {|k,v| v != "testC@test.com"} # => returns array without any changes
Run Code Online (Sandbox Code Playgroud)
    mu *_*ort 51
我想你正在寻找这个:
filtered_array = array.reject { |h| blacklist.include? h['email'] }
Run Code Online (Sandbox Code Playgroud)
或者如果你想用select而不是reject(也许你不想伤害任何人的感受):
filtered_array = array.select { |h| !blacklist.include? h['email'] }
Run Code Online (Sandbox Code Playgroud)
您的
array.select {|k,v| ...
Run Code Online (Sandbox Code Playgroud)
尝试将无法工作,因为数组移动Enumerable阻塞单个元素,并且在这种情况下该元素将是Hash,但|k,v|如果array有两个元素数组作为元素,则该技巧将起作用.