我找不到从散列中删除不在给定键名数组中的键的方法。我读到我可以使用except
或slice
,但是如何向他们提供我想要保留的密钥名称列表?例如,如果我有这个哈希:
entry = {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en", :imdb=>"", :freebase=>"", :originalTitle => 'casablanca', :season=> '1', :episode => '3'}
我只想保留:title
,:media
和:localeLanguage
,我怎么能只保留我指定其键名的那些值?
答案 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中,哈希是无序的。