सवाल रूबी में स्ट्रिंग में हैश फ़्लैटिंग


क्या एक हैश को एक स्ट्रिंग में फ़्लैट करने का कोई तरीका है, जिसमें चाबियाँ और मानों और कुंजी / मूल्य जोड़े के बीच वैकल्पिक डिलीमीटर हैं?

उदाहरण के लिए, print {:a => :b, :c => :d}.flatten('=','&') प्रिंट करना चाहिए a=b&c=d

मैंने ऐसा करने के लिए कुछ कोड लिखा, लेकिन मैं सोच रहा था कि क्या एक साफ रास्ता था:

class Hash
  def flatten(keyvaldelimiter, entrydelimiter)
    string = ""
    self.each do
      |key, value|
      key = "#{entrydelimiter}#{key}" if string != "" #nasty hack
      string += "#{key}#{keyvaldelimiter}#{value}"  
    end
    return string
  end
end

print {:a => :b, :c => :d}.flatten('=','&') #=> 'c=d&a=b'

धन्यवाद


44
2018-06-15 16:17


मूल




जवाब:


मैं ओवरराइड नहीं करता .flatten, जो पहले ही परिभाषित है:

एक नई सरणी देता है जो एक है   इसका एक-आयामी फ़्लैटनिंग   हैश। यही है, हर कुंजी या मूल्य के लिए   वह एक सरणी है, इसके तत्व निकालें   नई सरणी में। भिन्न   ऐरे # flatten, यह विधि नहीं है   डिफ़ॉल्ट रूप से पुनरावर्ती flatten। अगर   वैकल्पिक स्तर तर्क निर्धारित करता है   flatten करने के लिए रिकर्सन का स्तर।

ऐसा करने का यह सबसे आसान तरीका है कि मुझे पता है:

{:a => 100, :b => 200}.map{|k,v| "#{k}=#{v}"}.join('&')
# => "a=100&b=200"

98
2018-06-15 16:33



आप इसे और सरल बना सकते हैं। विवरण के लिए मेरा जवाब देखें। गिस्ट को प्रतिस्थापित करना है |k, v| साथ में |e| किसने बनाया e एक सरणी जिसे आप कॉल कर सकते हैं e.join('=') पर। - Jörg W Mittag
हैश प्राप्त करने के लिए रिवर्स कैसे करें - januprasad


@ Elektronaut के संस्करण की थोड़ी भिन्नता:

आप वास्तव में सिर्फ एक डाल सकते हैं |e| इसके बजाय वहाँ |k, v| कौनसे मामलेमें e दो तत्वों की एक सरणी है और आप कॉल कर सकते हैं e.join('=')। कुल मिलाकर आपके पास कुछ है

class Hash
  def join(keyvaldelim=$,, entrydelim=$,) # $, is the global default delimiter
    map {|e| e.join(keyvaldelim) }.join(entrydelim)
  end
end

{a: 100, b: 200}.join('=', '&') # I love showing off the new Ruby 1.9 Hash syntax
# => 'a=100&b=200'

22
2018-06-15 18:31



मैं गंभीरता से सवाल करता हूं कि बंदर पैच के लिए कितना स्मार्ट है Hash, विशेष रूप से एक गैर-नामित विधि नाम के साथ join। जबकि मैं इसे कई लोगों से उम्मीद करता हूं, मैं बहुत अनुभवी देव से ऐसे सुझाव को देखकर बहुत हैरान हूं। - akostadinov


खैर, आप इसे मानक तरीकों और सरणी के साथ कर सकते हैं:

class Hash
  def flatten(keyvaldelimiter, entrydelimiter)
    self.map { |k, v| "#{k}#{keyvaldelimiter}#{v}" }.join(entrydelimiter)
  end
end

आप में भी रुचि हो सकती है रेल to_query तरीका

इसके अलावा, जाहिर है, आप लिख सकते हैं "#{k}#{keyvaldelimiter}#{v}" जैसा k.to_s + keyvaldelimiter + v.to_s...


5
2018-06-15 16:27



या [k,v].join(keyvaldelimiter)। - henrikhodne


यदि आप एक यूआरएल क्वेरी स्ट्रिंग जेनरेट करने का प्रयास कर रहे हैं, तो आपको निश्चित रूप से एक्टिव्सपोर्ट की to_param (to_query से aliased) जैसी विधि का उपयोग करना चाहिए। यदि आपके पास डेटा में एम्पर्सेंड या बराबर चिह्न था तो समस्याएं कल्पना करें।

to_query भागने का ख्याल रखता है:

>> require 'active_support/core_ext/object'
>> {'a&' => 'b', 'c' => 'd'}.to_query
>> => "a%26=b&c=d"

संपादित करें

@fahadsadah रेल लोड करने के इच्छुक नहीं होने के बारे में एक अच्छा मुद्दा बनाता है। यहां तक ​​कि active_support / core_ext / ऑब्जेक्ट 71 फ़ाइलों को लोड करेगा। यह भी बंदर-पैच कोर कक्षाओं।

एक हल्का और क्लीनर समाधान:

require 'rack'  # only loads 3 files
{'a&' => 'b', 'c' => 'd'}.map{|pair|
  pair.map{|e| Rack::Utils.escape(e.to_s) }.join('=')
}.join('&')
# => "a%26=b&c=d"

बचाना महत्वपूर्ण है, अन्यथा ऑपरेशन उलटा नहीं है।


4
2018-03-20 18:27



यह सब ठीक है, और यह एक अच्छा मुद्दा है, लेकिन जब मैंने स्रोत हैश बनाया है तो मुझे रेल की स्थापना की आवश्यकता नहीं होगी - Fahad Sadah
जीत के लिए रेल !! - Joshua Pinter


सुनिश्चित नहीं है कि कोई अंतर्निहित तरीका है, लेकिन यहां कुछ छोटा कोड है:

class Hash
  def flatten(kvdelim='', entrydelim='')
    self.inject([]) { |a, b| a << b.join(kvdelim) }.join(entrydelim)
  end
end

puts ({ :a => :b, :c => :d }).flatten('=', '&') # => a=b&c=d

1
2018-06-15 16:27





JSON प्रारूप में इसे प्राप्त करने के बारे में क्या। इस तरह प्रारूप स्पष्ट है।

रूबी के लिए बहुत सारे JSON उपकरण हैं। हालांकि, कभी कोशिश नहीं की। लेकिन आउटपुट निश्चित रूप से जावास्क्रिप्ट, आदि में स्लाइड कर देगा। शायद एक लाइन।

बड़ी बचत, हालांकि दस्तावेज़ीकरण में होगी, जिसमें आपको बहुत कम आवश्यकता होगी।


0
2018-06-15 20:24