2012-10-12 16 views
5

特定のキー名の配列にないキーをハッシュから削除する方法が見つかりません。私はexceptまたはsliceを使うことができると読んだが、私はそれらに私が保持したいキー名のリストを与えることができますか?ですから、例えば、私はこのハッシュ持っていた場合:配列ではないハッシュのキーを削除する

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

を、私はそのキー名私が指定した値だけを保つことができるどのように私は、たとえば、:title:media:localeLanguageを維持したいですか?ルビー1.9.3において

答えて

17

keep_if(1.9.2必要)を使用します。 Railsでは

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

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

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

Wonderful!ありがとうトーマス、これは素晴らしいです。私は '.keep_if'について知らなかった。これはRuby 1.9.xですか?ああ私はあなたがそれを明確にするためにそれを編集したのを見ます。ありがとう。 – kakubei

+1

この場合、正常に読み込みます。一部の人々は(それを好きではない)(http://news.ycombinator.com/item?id=2247352)。 –

4

ルビー1.8.7において
entry = entry.select do |key, value| 
    [:title, :media, :localeLanguage].include?(key) 
end 
p entry 
# => {:title=>"casablanca", :media=>"dvd", :localeLanguage=>"en"} 

、ハッシュ番号は配列の配列戻りを選択するので、ハッシュは[]ハッシュにその配列を回すために使用する:

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

順番の違いは、Ruby 1.8.7では、ハッシュの順番が異なるためです。

+1

1.9.3と1.8.7の両方のソリューションをご利用いただきありがとうございます。非常に便利なので、ある時点でコードを1.8.7に変換しなければならない可能性があります(うまくいけない!) – kakubei

14

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

使用slice!その場であなたのハッシュを修正します。

関連する問題