2012-04-30 19 views
0

サンプルハッシュ値:取得キー値は

{ 
    "audio" => { 
     "audio/aac" => ["aac"], 
     "audio/mpeg" => ["mp3", "mp2"], 
     "audio/mp4" => ["m4a", "m4b", "m4r", "3gp"], 
     "audio/ogg" => ["ogg", "oga"], 
     "audio/flac" => ["flac"], 
     "audio/speex" => ["spx"], 
     "audio/x-ms-wma" => ["wma"], 
     "audio/x-pn-realaudio" => ["rm", "ram"], 
     "audio/vnd.wave" => ["wav"], 
     "audio/x-musepack" => ["mpc", "mp+", "mpp"], 
     "audio/x-aiff" => ["aiff", "aif", "aifc"], 
     "audio/x-tta" => ["tta"] 
    }, 
    "video" => { 
     "video/mp4" => ["mp4"], 
     "video/mpeg" => ["mpg", "mpeg"], 
     "video/x-m4v" => ["m4v"], 
     "video/quicktime" => ["mov"], 
     "video/x-msvideo" => ["avi"], 
     "video/x-flv" => ["flv"], 
     "video/webm" => ["webm"] 
    } 
    } 

(最初の試合は大丈夫です)関連するコンテンツタイプを取得するには、ファイルの拡張子を指定した最良の方法は何ですか?

「flac」を検索すると「audio/flac」が返されます。現在、私はこれを使用してい

あなたはすでにあなたが持っているデータ構造は、あなたが望む方法で検索する恐ろしいです実現してきたように
hsh.each_key do |group| 
    hsh[group].each do |k,v| 
    return k if v.include?(extension) 
    end 
end 

答えて

4

この種の構造を解明することが最も効果的です。しかし、さまざまなレベルをループして、そこから有用なものを得ることができます。

冗長に
Hash[*mime_hash.map{ |av, types| types.map{ |mime_type, extensions| extensions.product([mime_type]) } }.flatten] 

以上:

Hash[ 
    *mime_hash.map{ |av, types| 
    types.map{ |mime_type, extensions| 
     extensions.product([mime_type]) 
    } 
    }.flatten 
] 

戻りますどの:私はmime_hashにあなたの最初のハッシュを割り当てた場合、私は使用してそれを解明することができます

{ 
    "aac" => "audio/aac", 
    "mp3" => "audio/mpeg", 
    "mp2" => "audio/mpeg", 
    "m4a" => "audio/mp4", 
    "m4b" => "audio/mp4", 
    "m4r" => "audio/mp4", 
    "3gp" => "audio/mp4", 
    "ogg" => "audio/ogg", 
    "oga" => "audio/ogg", 
    "flac" => "audio/flac", 
    "spx" => "audio/speex", 
    "wma" => "audio/x-ms-wma", 
     "rm" => "audio/x-pn-realaudio", 
    "ram" => "audio/x-pn-realaudio", 
    "wav" => "audio/vnd.wave", 
    "mpc" => "audio/x-musepack", 
    "mp+" => "audio/x-musepack", 
    "mpp" => "audio/x-musepack", 
    "aiff" => "audio/x-aiff", 
    "aif" => "audio/x-aiff", 
    "aifc" => "audio/x-aiff", 
    "tta" => "audio/x-tta", 
    "mp4" => "video/mp4", 
    "mpg" => "video/mpeg", 
    "mpeg" => "video/mpeg", 
    "m4v" => "video/x-m4v", 
    "mov" => "video/quicktime", 
    "avi" => "video/x-msvideo", 
    "flv" => "video/x-flv", 
    "webm" => "video/webm" 
} 
+0

Nice、 'Array#product'について知りませんでした。 –

+0

map + flatten(1)= flat_map。ハッシュ[...]ペアを取る、合計平らにする必要はありません。 – tokland

0

。あなたが何をすべきか何度も同じデータを検索しようとしていると仮定すると、インデックスを作成することです。

これを実行する方法はたくさんありますが、最も簡単なのはおそらく、ハッシュを平坦化して反転させてキーが値になるようにすることです。あなたは、単にcontent_types['flac']

を呼び出すことによって、それを検索することができますその方法は、例えば、ハッシュのセクションでは、このように終わるかもしれません:

{ 
    "aac" => "audio/aac", 
    "mp3" => "audio/mpeg", 
    "mp2" => "audio/mpeg", 
    "m4a" => "audio/mp4", 
    "m4b" => "audio/mp4", 
    "m4r" => "audio/mp4", 
    "3gp" => "audio/mp4", 
    "flac" => "audio/flac" 
} 
+0

をはい、構造は、理想的ではありませんそれは主にアプリケーション内の他の目的(したがってオーディオ/ビデオグループ)に役立ち、extによるMIMEタイプの解決を求められていませんでした。 – kain

0

使用してみてくださいrassoc()

定義:ハッシュによる

検索==を使用してobjを値と比較します。一致する最初のキーと値のペア(2要素配列)を返します。 Array#rassocも参照してください。

a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"} 
a.rassoc("two") #=> [2, "two"] 
a.rassoc("four") #=> nil 
+0

私はこの種のハッシュでは期待どおりに動作しないのではないかと恐れています。キーが配列の場合、 'hash [" audio "]。rassoc([" m4b "])'は何も返しませんので問題になります。例がありますか? – kain

関連する問題