0

我需要将字符串与其他字符串进行匹配,特别是文件类型的扩展名或 mime 类型。例如 "png","image/png","image/jpeg" 应该匹配到 "image" 等。

目前我正在使用这种方法:

fileFormats = {
    'image/png':'image',
    'image/jpeg':'image',
    'png':'image',
    'jpeg':'image',
    'jpg':'image'
}

fileFormats["png"]

然而,随着扩展/mime 类型数量的增加,这可能会变得非常重复。我也认为应该/有更好的方法来做到这一点。有任何想法吗?

4

2 回答 2

1

如果您制作从格式名称到 mime 类型和/或文件扩展名的映射,则不应重复。然后,您可以反转列表:

mimeTypes = {
    'image' : ['image/png', 'image/jpeg', 'png', 'jpeg', 'jpg', ...],
    'text'  : [ . . .],
    . . .
}
fileFormats = {};
for (type in mimeTypes) {
    mimeList = mimeTypes[type];
    for (i = 0, n = mimeList.length; i < n; ++i) {
        fileFormats[mimeList[i]] = type;
    }
}
于 2013-08-19T06:53:16.403 回答
0

不是真的,在某些时候你仍然需要一本字典/地图。

我的第一条评论是你不应该在同一个地图中混合 MIME 和文件扩展名。相反,您应该有 2 张地图:

extensionToMime = {};
mimeToExtension = {};

第二条评论是 1 个扩展可以有超过 1 个 MIME,所以 extensionToMime 映射的值应该是数组。

但是,如果您真的想避免使用映射(这将在 O(1) 中返回您的结果,顺便说一句,很难做到更快),您仍然可以根据其扩展找出一些构建 MIME 类型的规则。例如:

 var simpleMimes = { "png":true, "jpeg":true, "gif":true }; // mimicking a set
 // then, when you need it:
 function getMimeFromExtension(ext) {
   if (ext in simpleMimes) {
     return "image/" + ext;
   }
   return extensionToMime[ext];
 }

这显然不适用于所有扩展,并且仅在您使用少量可以像这样轻松构建的 MIME 时才有效。

于 2013-08-19T06:53:10.333 回答