मैं हैश के एक हैश पर कैसे लूप कर सकता हूं?


81

मेरे पास यह हैश है:

 h
 => {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}} 

>  h.each do |key, value|
>     puts key
>   puts value
>   end
67676.mpa
linkpool/sdafdsaffsize4556

मैं लूप पर मान हैश में अलग-अलग मानों का उपयोग कैसे करूं?


1
आप आउटपुट के रूप में क्या देखना चाहेंगे?
मार्क थॉमस

appcoach शिंगारा ने बहुत अच्छा काम किया .... मुझे एक खाली हाथ चाहिए ... जवाब मेरे सामने सही था ... मुझे एक आंतरिक लूप करना था
मैट एल्होटिबी

यह अच्छी तरह से ज्ञात है कि एक हैश पर पुट का उत्पादन बहुत बेकार है, क्या आपने "हैश.इनस्पेक्ट डालता है" की कोशिश की?
16

जवाबों:


161

मान एक हैश है इसलिए आपको इस पर पुनरावृति की आवश्यकता है या आप केवल मान प्राप्त कर सकते हैं: -

h.each do |key, value|
  puts key
  value.each do |k,v|
    puts k
    puts v
  end
end

या

h.each do |key, value|
  puts key
  value.values.each do |v|
    puts v
  end
end


अगर कहीं भी कुंजी का उपयोग नहीं किया जाता है तो यहां क्या होगा? । क्या हमें ?कुंजी के स्थान पर रखने की आवश्यकता है ? पूर्व: |?, array|यह के लिए वैध वाक्यविन्यास है Ruby?
हुजैफा बियावरवाला

@huzefabiyawarwala यदि कुंजी का उपयोग उस पुनरावृत्ति में नहीं किया जाता है, तो आपको इसे अंडरस्कोर के साथ उपसर्ग करना चाहिए जैसे|_key, value|
सेवेरिन

17

आप हैश के माध्यम से पुनरावृत्ति करना चाहते हैं, यहाँ एक पुनरावर्ती विधि है:

def ihash(h)
  h.each_pair do |k,v|
    if v.is_a?(Hash)
      puts "key: #{k} recursing..."
      ihash(v)
    else
      # MODIFY HERE! Look for what you want to find in the hash here
      puts "key: #{k} value: #{v}"
    end
  end
end

फिर आप किसी भी हैश को ले सकते हैं और उसमें पास कर सकते हैं:

h = {
    "x" => "a",
    "y" => {
        "y1" => {
            "y2" => "final"
        },
        "yy1" => "hello"
    }
}
ihash(h)

अगर कहीं भी कुंजी का उपयोग नहीं किया जाता है तो यहां क्या होगा? । क्या हमें ?कुंजी के स्थान पर रखने की आवश्यकता है ? पूर्व: |?, array|यह वैध वाक्यविन्यास है?
हुजैफा बियावरवाला

इसे रखें, बस इसका उपयोग न करें। प्रश्न चिह्न मान्य नहीं है।
ट्रैविस रीडर

7

मैंने ट्रैविस के उत्तर को थोड़ा सुधार दिया, इस बारे में कैसे बताया:

https://gist.github.com/kjakub/be17d9439359d14e6f86

class Hash

  def nested_each_pair
    self.each_pair do |k,v|
      if v.is_a?(Hash)
        v.nested_each_pair {|k,v| yield k,v}
      else
        yield(k,v)
      end
    end
  end

end

{"root"=>{:a=>"tom", :b=>{:c => 1, :x => 2}}}.nested_each_pair{|k,v|
  puts k
  puts v
}

@ ट्राविस आर ने बेहतर उत्तर दिया
जैकब कुचर

5

इस मामले में सभी तीन मूल्यों को अलग करने का सबसे सरल तरीका इस प्रकार होगा:

h.each do |key, value|
  puts key
  puts value[:link]
  puts value[:size]
end

2

आप कॉल करके सीधे हैश के मूल्यों तक पहुँच सकते हैं hash.values। इस मामले में आप कुछ ऐसा कर सकते हैं

> h = {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}}
> h.values.each do |key, value|
>   puts "#{key} #{value}"
> end

link pool/sdafsaff
size 4556
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.