2012-10-12 26 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!修改散列的地方。