2012-10-12 28 views
5

我無法找到一種方法來從散列中刪除不在給定的鍵名稱數組中的鍵。我讀到,我可以使用exceptslice,但我怎麼能給他們一個我想保留的關鍵名稱列表?因此,舉例來說,如果我有這個散列:在哈希中刪除鍵不在數組中

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'。這只是Ruby 1.9.x?啊。我看到你編輯它來澄清這一點。謝謝。 – kakubei

+1

在這種情況下,它讀得很好。有些人[不喜歡它](http://news.ycombinator.com/item?id=2247352)。 –

4

在Ruby 1.9.3:

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

在Ruby 1.8.7,哈希#選擇返回數組的數組,所以使用哈希[]打開該陣列爲哈希:

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

順序上的差異是因爲在Ruby 1.8.7中,哈希是無序的。

+1

感謝您爲1.9.3和1.8.7推出解決方案。非常有用,因爲我可能需要在某些時候將代碼轉換爲1.8.7(希望不是!) – kakubei

14

在Rails 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!修改散列的地方。