通过键数组值获取嵌套Hash中的键值(Getting key value in nested Hash by key array values)
示例哈希:
{ "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 endSample hash:
{ "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"] } }What's the best way given a file extension to get the associated content type (first match is okay)?
Searching for "flac" should return "audio/flac".
Currently I'm using this:
hsh.each_key do |group| hsh[group].each do |k,v| return k if v.include?(extension) end end最满意答案
解开这种结构最好在创建时完成。 但是,您可以遍历各个级别并从中获得有用的东西。 如果我将初始哈希值分配给mime_hash我可以使用以下方法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" }Unraveling that sort of structure is best done when it's created. But, you can loop through the various levels and get something useful from it. If I assign your initial hash to mime_hash I can unravel it using:
Hash[*mime_hash.map{ |av, types| types.map{ |mime_type, extensions| extensions.product([mime_type]) } }.flatten]or more verbosely:
Hash[ *mime_hash.map{ |av, types| types.map{ |mime_type, extensions| extensions.product([mime_type]) } }.flatten ]Which will return:
{ "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" }更多推荐
发布评论