रूबी - रूबी, हैश में स्ट्रिंग में हैश को फ़्लैट करना

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

उदाहरण के लिए, 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"

धन्यवाद

उत्तर:

उत्तर № 1 के लिए 96

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

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

यह ऐसा करने का सबसे सरल तरीका है, जिसके बारे में मुझे पता है:

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

जवाब के लिए 22 № 2

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

जवाब के लिए 5 № 3

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

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...


जवाब के लिए 4 № 4

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

बचने के लिए देखभाल करता है:

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

संपादित करें

@ इफ़्साददह रेल को लोड नहीं करने के बारे में एक अच्छी बात करता है। यहां तक ​​कि 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"

यह भागने के लिए महत्वपूर्ण है, अन्यथा ऑपरेशन isn "टी प्रतिवर्ती।


उत्तर के लिए 1 № 5

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

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

जवाब के लिए 0 № 6

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

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

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


संबंधित सवाल
सबसे लोकप्रिय