रूबी हैश से सभी चाबियाँ प्राप्त करें जहां मूल्य हैश के साथ सरणी है - रूबी, सरणी, हैश

अगर मेरे पास है Hash जैसे कि सबहाश के साथ, जो ए के मूल्य के सरणी में घिरे होते हैं Hash:

{"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}


def get_keys(hash)
(hash.keys + hash.values.grep(Hash){|sub_hash| get_keys(sub_hash)}).flatten
end

पिछले कार्य के साथ मैं केवल प्राप्त कर सकता हूं ["school","teachers"], लेकिन मुझे हैश की चाबियों की भी आवश्यकता है, जो "शिक्षकों" मान की सरणी में हैं: ["school","teachers","name","age","name","age"]

पसंदीदा में मैं परिणामस्वरूप डुप्लीकेट को खत्म करना चाहता हूं: ["school","teachers","name","age"]

उत्तर:

जवाब के लिए 2 № 1
def get_keys(object)
if object.is_a? Hash
(object.keys + get_keys(object.values)).flatten.uniq
elsif object.is_a? Array
object.collect{|value| get_keys value}
else
[]
end
end

I think this is quite clear, and you can nest as जितना चाहें उतना यदि ऑब्जेक्ट एक सरणी या हैश नहीं है, तो कोई चाबियाँ नहीं हैं। यदि यह एक सरणी है, तो यह उन सभी कुंजीों की तलाश करेगा जो सभी तत्वों में हो सकती हैं और यदि यह एक हैश है, तो यह अपनी चाबियाँ, साथ ही हैश की चाबियाँ भी वापस कर देगा जो हैश के मूल्यों पर हो सकती हैं। फिर आप आवेदन करें flatten संभव खाली सरणी को हटाने के लिए, और uniq डुप्लिकेट मानों को हटाने के लिए।

सरणी के साथ, यह उन चाबियाँ प्राप्त करेगी जो अंदर हो सकती हैं


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

आप उपयोग कर सकते हैं Enumerable#each_with_object ऐसा कुछ करने के लिए और जब मान एक ऐरे है, तो सरणी में प्रत्येक ऑब्जेक्ट के लिए समान फ़ंक्शन को दोबारा कॉल करें।

hash = {"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}

def get_keys(hash)
hash.each_with_object([]) do |(k, v), arr|
arr << k
if v.is_a? Array
arr << v.map { |hash2| get_keys(hash2) }.uniq
end
end
end

puts get_keys(hash)
=> ["school", "teachers", "name", "age"]

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