2012-10-12 22 views
5

में मुझे हैश से कुंजी को हटाने का कोई तरीका नहीं मिल रहा है जो कि किसी भी कुंजी के दिए गए सरणी में नहीं है। मैंने पढ़ा है कि मैं except या slice का उपयोग कर सकता हूं, लेकिन मैं उन्हें उन प्रमुख नामों की एक सूची कैसे खिला सकता हूं जिन्हें मैं रखना चाहता हूं? उदाहरण के लिए, अगर मैं इस हैश था:हैश में कुंजी को हटाएं

entry = {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en", :imdb=>"", :freebase=>"", :originalTitle => 'casablanca', :season=> '1', :episode => '3'} 

और मैं सिर्फ, मैं कैसे केवल उन मूल्यों जिसका प्रमुख नाम मेरे द्वारा निर्दिष्ट रख सकता है रखने के लिए, कहते हैं, :title, :media और :localeLanguage चाहते थे?

उत्तर

17

मैं keep_if (1.9.2 की आवश्यकता है) का उपयोग करता हूं।

keepers = [:title, :media, :localeLanguage] 

entry.keep_if {|k,_| keepers.include? k } 

#=> {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"}  
+0

अद्भुत! धन्यवाद थॉमस, यह बहुत अच्छा है। मुझे 'keep_if' के बारे में पता नहीं था। क्या यह केवल रूबी 1.9.एक्स है? आह। मैं देखता हूं कि आपने इसे स्पष्ट करने के लिए इसे संपादित किया है। धन्यवाद। – kakubei

+1

इस मामले में, यह अच्छी तरह से पढ़ता है। कुछ लोग [इसे पसंद नहीं करते] (http://news.ycombinator.com/item?id=2247352)। –

4

रूबी 1.9.3 में:

entry = entry.select do |key, value| 
    [:title, :media, :localeLanguage].include?(key) 
end 
p entry 
# => {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"} 

रूबी 1.8.7 में, हैश # रिटर्न सरणियों की एक सरणी का चयन करें, तो एक हैश में कि सरणी चालू करने के लिए उपयोग करने के हैश []:

entry = Hash[ 
    entry.select do |key, value| 
    [:title, :media, :localeLanguage].include?(key) 
    end 
] 
# => {:media=>"dvd", :localeLanguage=>"en", :title=>"casablanca"} 

क्रम में अंतर इसलिए है क्योंकि रूबी 1.8.7 में, हैश अनियंत्रित हैं।

+1

1.9.3 और 1.8.7 दोनों के लिए समाधान डालने के लिए धन्यवाद। काफी उपयोगी है क्योंकि मुझे किसी बिंदु पर कोड को 1.8.7 में परिवर्तित करना पड़ सकता है (उम्मीद है कि नहीं!) – kakubei

14

रेल में 4+, slice का उपयोग करें:

entry = {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en", :imdb=>"", :freebase=>"", :originalTitle => 'casablanca', :season=> '1', :episode => '3'} 
keepers = [:title, :media, :localeLanguage] 

entry.slice(*keepers) 
# => {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"} 

उपयोग slice! में जगह अपने हैश संशोधित करने के लिए।

संबंधित मुद्दे