해시 특정 키를 제외하고 모두 제거


85

주어진 키를 제외한 모든 키를 해시에서 제거하고 싶습니다.

예를 들면 :

{
 "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"를 제외한 모든 항목을 제거하고 싶습니다.

감사

답변:


50

기타 옵션 :

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")

1
더 많은 OR 문 대신 새 키를 매우 빠르게 추가 할 수 있도록 배열을 사용하는 것을 좋아합니다. 해시 확장 : 좀 냉각도
제이크 뎀시

1
감사. 훨씬 더 포괄적 인 답변!
glarkou 2011

레일 전용인가요? 또는 일반적으로 루비?
Fadi

280

어때 slice?

hash.slice('firstName', 'lastName')
 # => { 'firstName' => 'John', 'lastName' => 'Smith' }

9
이 질문은 Rails를 구체적으로 언급하지는 않았지만 태그가 붙어 있습니다. 이것은 Rails 또는 core_ext를 사용할 때 가장 좋은 옵션입니다.
Caleb Hearth

3
예, 이것이 제가 제안한 이유 slice입니다.
Mario Uher 2012-08-21

이 대답은 첫 번째 대답이어야합니다!
mmike jul.

@DimaMelnik Hashes는 본질적으로 주문이 없습니다.
여호수아 핀터

2
Hash # slice 는 이제 순수 Ruby이며 Rails는 필요하지 않습니다.
akim 2010 년

6

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

예에서 "연령"과 "주소"를 선택하려면 어떻게해야합니까?
glarkou 2011

2

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 }

20
예외는 주어진 것을 제외한 모든 것을 유지합니다. 질문 내용의 반대입니다.
Christopher Oezbek

1

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

0

매우 간결한 코드를 얻기 위해 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

0
hash = { a: true, b: false, c: nil }
hash.extract!(:c) # => { c: nil }
hash # => { a: true, b: false }

지정된 키를 포함하지 않고 지정된 키를 제외합니다. 차이는 미묘하지만 중요하다
BKSpurgeon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.