IT박스

Ruby 해시 화이트리스트 필터

itboxs 2020. 11. 19. 07:58
반응형

Ruby 해시 화이트리스트 필터


한 필터에서 다른 필터로 키 및 값 쌍을 필터링하는 방법을 알아 내려고합니다.

예를 들어이 해시를 사용하고 싶습니다.

x = { "one" => "one", "two" => "two", "three" => "three"}

y = x.some_function

y == { "one" => "one", "two" => "two"}

당신의 도움을 주셔서 감사합니다

편집 :이 예제에서는 화이트리스트 필터로 작동하기를 원합니다. 즉, 내가 원하지 않는 것이 아니라 내가 원하는 것을 압니다.


아마도 이것은 당신이 원하는 것입니다.

wanted_keys = %w[one two]
x = { "one" => "one", "two" => "two", "three" => "three"}
x.select { |key,_| wanted_keys.include? key }

예를 들어 Array 및 Hash에 포함 된 Enumerable mixin은 select / reject / each / etc와 같은 유용한 방법을 많이 제공합니다. ri Enumerable로 이에 대한 문서를 살펴볼 것을 제안합니다.


Rails의 ActiveSupport 라이브러리는 키 수준에서 해시를 처리하는 것을 제외하고 슬라이스를 제공합니다.

y = x.slice("one", "two") # => { "one" => "one", "two" => "two" }
y = x.except("three")     # => { "one" => "one", "two" => "two" }
x.slice!("one", "two")    # x is now { "one" => "one", "two" => "two" }

이것들은 꽤 좋으며 항상 사용합니다.


내장 해시 함수 거부를 사용할 수 있습니다.

x = { "one" => "one", "two" => "two", "three" => "three"}
y = x.reject {|key,value| key == "three" }
y == { "one" => "one", "two" => "two"}

원하는 로직을 거부에 넣을 수 있으며 블록이 true를 반환하면 새 해시에서 해당 키, 값을 건너 뜁니다.


약간 @scottd 대답을 개선하면 레일을 사용하고 필요한 목록이 있으면 목록을 슬라이스의 매개 변수로 확장 할 수 있습니다. 예를 들면

hash = { "one" => "one", "two" => "two", "three" => "three"}
keys_whitelist = %W(one two)
hash.slice(*keys_whitelist)

레일없이 루비 버전의 경우 다음을 수행 할 수 있습니다.

hash = { "one" => "one", "two" => "two", "three" => "three"}
keys_whitelist = %W(one two)
Hash[hash.find_all{|k,v| keys_whitelist.include?(k)}] 

y = x.reject {|k,v| k == "three"}

모든 사람의 답변을 조합하여이 솔루션을 찾았습니다.

 wanted_keys = %w[one two]
 x = { "one" => "one", "two" => "two", "three" => "three"}
 x.reject { |key,_| !wanted_keys.include? key }
 =>{ "one" => "one", "two" => "two"}

도와 주셔서 감사합니다!

편집하다:

위는 1.8.7 이상에서 작동합니다.

다음은 1.9 이상에서 작동합니다.

x.select {| 키, _ | wanted_keys.include? 키}


람다를 사용하여 필터링합니다. 이렇게하면 복잡한 필터링 논리를 작성하고 쉽게 테스트 할 수 있습니다. 필터링 로직이 추출된다는 사실은 다른 컨텍스트에서 재사용 할 수 있습니다.

전의:

x = { "one" => "one", "two" => "two", "three" => "three"}

matcher = ->(key,value) { 
  # FILTERING LOGIC HERE 
   !key[/three/]
}

x.select(&matcher) == { "one" => "one", "two" => "two"}

참고URL : https://stackoverflow.com/questions/711863/ruby-hash-whitelist-filter

반응형