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

问题描述 投票:8回答:3

我找不到从散列中删除不在给定键名数组中的键的方法。我读过我可以使用exceptslice,但我怎样才能为它们提供我想要保留的关键名称列表?所以,例如,如果我有这个哈希:

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

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

ruby hash
3个回答
20
投票

我会使用keep_if(要求1.9.2)。

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

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

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

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!就地修改哈希值。


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中,哈希是无序的。

© www.soinside.com 2019 - 2024. All rights reserved.