我找不到从散列中删除不在给定键名数组中的键的方法。我读过我可以使用except
或slice
,但我怎样才能为它们提供我想要保留的关键名称列表?所以,例如,如果我有这个哈希:
entry = {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en", :imdb=>"", :freebase=>"", :originalTitle => 'casablanca', :season=> '1', :episode => '3'}
我只想保留:title
,:media
和:localeLanguage
,我怎么能只保留那些我指定的关键名称的值?
我会使用keep_if
(要求1.9.2)。
keepers = [:title, :media, :localeLanguage]
entry.keep_if {|k,_| keepers.include? k }
#=> {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"}
在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!就地修改哈希值。
在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中,哈希是无序的。