मेरे पास निम्नलिखित हैश है:
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
वास्तव में, आप क्या चाहते हैं। या तो वह, या कुंजियों की एक सूची को क्रमबद्ध करें और फिर इसका उपयोग करने के लिए जब यह हैश का उत्पादन करने का समय है, तो अपने स्वयं के तरीकों का उपयोग करके सीधे हैश पर गणना करने के बजाय।