2011-10-22 4 views
23

의 배열에서 요소를 제거 나는 다음과 같은 배열이 있습니다레일 : 해시

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]"}] 

내가 예를 들어, "블랙리스트"이메일의 목록을 가지고이 : 내가 좋아하는 뭔가를 할

blacklist = ["[email protected]"] 

이 :

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

은 분명히 ALL 기타 사항 서보 -OFF 또는 뭔가 함께 할 수있는 섹시한 루비 방법이있다,하지만 난 그것을 알아낼 수 없었다.

array.select {|k,v| v != "[email protected]"} # => returns array without any changes 

답변

51

난 당신이 찾고있는 생각 : 당신은 아마도 select 대신 reject을 (사용하려는 경우

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

또는 당신이 누군가의 상처를 싶지 않아 나는 아무 소용이 시도 감정) :

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

귀하의

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

배열은 Enumerable이 단일 요소를 차단하고이 요소가이 경우 해시가 될 것이기 때문에 시도가 작동하지 않습니다. array에 요소가 두 개있는 경우에도 |k,v| 트릭이 작동합니다.

+0

화려한! 빠른 전환에 감사드립니다 :) 실제로, 당신은 너무 빨리 대답하여 SO 시스템에 대한 대답을 "받아 들일"수조차 없습니다. – MorningHacker

+1

또한 exclude 기능이 있으며 이에 대한 별칭은 다음과 같습니다. include –

+0

@Darren : 유일한 단점은 ['exclude? '] (http://api.rubyonrails.org/classes/Enumerable.html#method-i- exclude-3F)은 Rails 확장이며 이중 부정적인 영토로 이어질 것입니다 :) 나는'reject' /'include? '와 함께 갈 것입니다. @mu와 비슷한 –

2

방법에 대한

array.delete_if {|key, value| value == "[email protected]" } 
+4

이 너무 짧아서'select'가 아니라면,'array.delete_if {| hash | 해시 [ "이메일"] == "[email protected]"}' – PeterWong

+0

delete_if inplace (일반적으로 좋은 생각이 아닙니다), OP는 새로운 배열을 원하는 것 같습니다. – tokland