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

3 に答える 3

4

そのような構造を解明することは、それが作成されたときに行うのが最善です。ただし、さまざまなレベルをループして、そこから何か役に立つものを得ることができます。最初のハッシュをに割り当てると、次をmime_hash使用してそれを解明できます。

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
] 

どちらが返されますか:

{
     "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"
}
于 2012-04-30T06:08:42.873 に答える
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"
}
于 2012-04-30T05:38:34.067 に答える
0

rassoc()を使ってみてください

意味:

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

a = {1=> "one", 2 => "two", 3 => "three", "ii" => "two"}
a.rassoc("two")    #=> [2, "two"]
a.rassoc("four")   #=> nil
于 2012-04-30T05:40:37.047 に答える