将字符串相互匹配

Match strings to each other

本文关键字:字符串      更新时间:2023-09-26

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

目前我使用的方法是:

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

然而,随着扩展/mime类型数量的增加,这种情况可能会变得非常重复。我还认为应该有更好的方法来做这件事。有什么想法吗?

如果您从格式名称映射到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;
    }
}

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

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

extensionToMime = {};
mimeToExtension = {};

第二个注释是,一个扩展可以有多个MIME,所以extensionToMime映射的值应该是数组。

然而,如果你真的想避免使用映射(它会以O(1)btw返回结果,很难更快地完成),你仍然可以根据其扩展来制定一些规则来构建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时,它才有效。