[ruby-on-rails] 해시 특정 키를 제외하고 모두 제거
주어진 키를 제외한 모든 키를 해시에서 제거하고 싶습니다.
예를 들면 :
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
“firstName”및 / 또는 “address”를 제외한 모든 항목을 제거하고 싶습니다.
감사
답변
기타 옵션 :
h.select {|k,v| ["age", "address"].include?(k) }
또는 다음과 같이 할 수 있습니다.
class Hash
def select_keys(*args)
select {|k,v| args.include?(k) }
end
end
이제 다음과 같이 말할 수 있습니다.
h.select_keys("age", "address")
답변
어때 slice
?
hash.slice('firstName', 'lastName')
# => { 'firstName' => 'John', 'lastName' => 'Smith' }
답변
Hash # select는 원하는 작업을 수행합니다.
h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
h.select {|k,v| v < 200} #=> {"a" => 100}
편집 (댓글 용) :
h가 위의 해시라고 가정합니다.
h.select {|k,v| k == "age" || k == "address" }
답변
Rails를 사용하는 경우 ActiveSupport except()
방법을 고려하십시오 : http://apidock.com/rails/Hash/except
hash = { a: true, b: false, c: nil}
hash.except!(:c) # => { a: true, b: false}
hash # => { a: true, b: false }
답변
Jake Dempsey의 답변에서 영감을 얻은이 방법은 전체 해시를 반복하는 대신 명시 적 키만 최대치에 달하기 때문에 큰 해시의 경우 더 빠릅니다.
class Hash
def select_keys(*args)
filtered_hash = {}
args.each do |arg|
filtered_hash[arg] = self[arg] if self.has_key?(arg)
end
return filtered_hash
end
end
답변
매우 간결한 코드를 얻기 위해 Rails가 필요하지 않습니다.
keys = [ "firstName" , "address" ]
# keys = hash.keys - (hash.keys - keys) # uncomment if needed to preserve hash order
keys.zip(hash.values_at *keys).to_h
답변
hash = { a: true, b: false, c: nil }
hash.extract!(:c) # => { c: nil }
hash # => { a: true, b: false }