विशिष्ट कुंजी को छोड़कर सभी को हटा दें


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" और / या "एड्रेस" को छोड़कर सब कुछ निकालना चाहता हूं

धन्यवाद

जवाबों:


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
मुझे सरणी का उपयोग करना पसंद है, ताकि बहुत जल्दी या अधिक या बयानों के बजाय नई कुंजी जोड़ने में आसान हो। हैश एक्सटेंशन भी थोड़े शांत है :)
— जेक डेम्पसे

1
धन्यवाद। ज्यादा व्यापक जवाब!
— ग्लार्कौ

क्या यह केवल रेल के लिए है? या सामान्य रूप से रूबी?
— फदी

280

किस बारे में slice?

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

9
प्रश्न में विशेष रूप से रेल का उल्लेख नहीं किया गया था, लेकिन इसे इस तरह टैग किया गया है। रेल या core_ext का उपयोग करते समय यह सबसे अच्छा विकल्प है।
— कालेब चूल्हा

3
हां, यही कारण है कि मैंने सुझाव दिया slice।
— मारियो उहेर

यह उत्तर पहले एक होना चाहिए!
— mmike

@DimaMelnik हैशेस स्वाभाविक रूप से एक आदेश नहीं है।
— यहोशू पिंटर

2
हैश # स्लाइस अब शुद्ध रूबी है, रेल की जरूरत नहीं है।
— एकिम

6

हैश # का चयन करें जो आप चाहते हैं:

   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.select {|k,v| k == "age" || k == "address" }

क्या होगा यदि मैं अपने उदाहरण से "उम्र" और "पता" चुनना चाहता हूं?
— ग्लार्कौ

2

यदि आप रेल का उपयोग करते हैं, तो कृपया 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
सिवाय दिए के सब कुछ छोड़कर। सवाल के बारे में क्या उल्टा है।
— क्रिस्टोफर ओजबेक

1

जेक डेम्पसी के जवाब से प्रेरित होकर, यह बड़ी हैश के लिए तेज़ होना चाहिए, क्योंकि यह पूरे हैश के माध्यम से चलने के बजाय केवल स्पष्ट कुंजियाँ दिखाती है:

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

बहुत संक्षिप्त कोड प्राप्त करने के लिए किसी रेल की आवश्यकता नहीं है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.