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
'IT박스' 카테고리의 다른 글
iOS 9에서 iPad 앱을 멀티 태스킹에서 제외 할 수 있습니까? (0) | 2020.11.19 |
---|---|
HTML 대신 일반 텍스트를 출력하는 angularjs (0) | 2020.11.19 |
Bootstrap의 스크롤 스파이 기능에 부드러운 스크롤을 추가하는 방법 (0) | 2020.11.19 |
console.log에 변수를 추가하려면 어떻게해야합니까? (0) | 2020.11.19 |
CUBE와 ROLLUP의 차이점 이해 (0) | 2020.11.19 |