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 与值进行比较的哈希。返回匹配的第一个键值对(二元素数组)。另请参见数组#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 回答