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


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.