मूल्य से हैश के छंटनी को छूना (और हैश को वापस करना, सरणी नहीं) - रूबी, डेटा-स्ट्रक्चर, हैश, सॉर्टिंग

मेरे पास निम्नलिखित हैश है:

user = {
"user" => {
"title" => {"weight" => 1, .... }
"body" => {"weight" => 4, ....}
....
....
}
}

क्या उपयोगकर्ता को अपने बच्चे के हैश की भार कुंजी द्वारा छांटना संभव है?

मैंने Hash.sort में देखा, लेकिन ऐसा लगता है कि यह मेरे मूल हैश के बजाय क्रमबद्ध रिटर्न देता है।

उत्तर:

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

रूबी 1.9 में, Hashतों को छांटा जाता है, लेकिन Hash#sort अभी भी एक रिटर्न Array का Arrayरों। कल्पना करो कि! इसका मतलब यह है कि आप इसके ऊपर अपनी खुद की छँटाई विधि का निर्माण कर सकते हैं।

class Hash
def sorted_hash(&block)
self.class[sort(&block)]   # Hash[ [[key1, value1], [key2, value2]] ]
end
end

Hashरूबी 1.8 में हैं। यदि आप रूबी 1.8 संगतता चाहते हैं, तो आप ActiveSupport का उपयोग कर सकते हैं OrderedHash। यह एक 1.9- की तरह व्यवहार करता हैHash, तो आप उसी को परिभाषित कर सकते हैं sorted_hash इस पर विधि:

class ActiveSupport::OrderedHash
def sorted_hash(&block)
self.class[sort(&block)]
end
end

hash = ActiveSupport::OrderedHash.new
hash["b"] = "b"
hash["a"] = "a"
hash               #=> {"b"=>"b", "a"=>"a"}  => unsorted
hash.sorted_hash   #=> {"a"=>"a", "b"=>"b"}  => sorted!

आपको कॉपी करना होगा sorted_hash आपके कोड के लिए विधि, क्योंकि यह डिफ़ॉल्ट रूप से मौजूद नहीं है!

गहरी छँटाई के लिए अद्यतन: यदि आप हैश कुंजी के अलावा किसी और चीज़ को सॉर्ट करना चाहते हैं, तो एक ब्लॉक पास करें sorted_hash विधि इस प्रकार है (ऊपर से क्रियान्वयन मानकर):

hash = ActiveSupport::OrderedHash.new
hash["a"] = { "attr" => "2", "..." => "..." }
hash["b"] = { "attr" => "1", "..." => "..." }

# Unsorted.
hash
#=> {"a"=>{"attr"=>"2", "..."=>"..."}, "b"=>{"attr"=>"1", "..."=>"..."}}

# Sort on the "attr" key. (Assuming every value is a Hash itself!)
hash.sorted_hash { |a, b| a[1]["attr"] <=> b[1]["attr"] }
#=> {"b"=>{"attr"=>"1", "..."=>"..."}, "a"=>{"attr"=>"2", "..."=>"..."}}

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

हैशिंग मूल रूप से बिना डेटा संरचनाएं हैं; Hash#sort वास्तव में, आप क्या चाहते हैं। या तो वह, या कुंजियों की एक सूची को क्रमबद्ध करें और फिर इसका उपयोग करने के लिए जब यह हैश का उत्पादन करने का समय है, तो अपने स्वयं के तरीकों का उपयोग करके सीधे हैश पर गणना करने के बजाय।