11

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

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

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

4

3 回答 3

25

在 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))

使用切片!就地修改您的哈希。

于 2014-11-12T09:38:51.083 回答
22

我会使用keep_if(需要 1.9.2)。

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

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

#=> {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"}      
于 2012-10-12T12:30:11.493 回答
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 中,哈希是无序的。

于 2012-10-12T12:18:57.337 回答