我需要将字符串与其他字符串匹配,特别是扩展名或mime类型与文件类型。例如“png”,“image / png”,“image / jpeg”应匹配“image”等。
目前我正在使用此方法:
fileFormats = {
'image/png':'image',
'image/jpeg':'image',
'png':'image',
'jpeg':'image',
'jpg':'image'
}
fileFormats["png"]
然而,随着扩展/ mime类型数量的增加,这可能会非常重复。 我也认为应该有/更好的方法。有任何想法吗?
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
实际上,在某些时候你仍然需要一个字典/地图。
我的第一个评论是你不应该在同一个地图中混合使用MIME和文件扩展名。相反,你应该有2张地图:
extensionToMime = {};
mimeToExtension = {};
第二条评论是1个扩展名可以包含多个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时才能使用。