删除哈希中的键不在数组中

时间:2012-10-12 12:14:13

标签: ruby hash

我找不到从散列中删除不在给定键名数组中的键的方法。我读到我可以使用exceptslice,但是如何向他们提供我想要保留的密钥名称列表?例如,如果我有这个哈希:

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

我只想保留:title:media:localeLanguage,我怎么能只保留我指定其键名的那些值?

3 个答案:

答案 0 :(得分:20)

我使用keep_if(需要1.9.2)。

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

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

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

答案 1 :(得分:20)

在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"}

更短版本(结果相同):

entry.slice(*%i(title media localeLanguage))

使用slice!就地修改哈希值。

答案 2 :(得分: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中,Hash #select返回一个数组数组,因此使用Hash []将该数组转换为哈希:

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

顺序的不同是因为,在Ruby 1.8.7中,哈希是无序的。