2013-08-19 4 views
0

Мне нужно сопоставить строки с другими строками, в частности, расширение или тип mime для типа файла. Например, «PNG», «изображение/PNG», «изображение/JPEG» должен соответствовать, чтобы «образ» и т.д.Соответствующие строки друг другу

В настоящее время я использую этот метод:

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

fileFormats["png"] 

Однако это может получить довольно повторяющиеся, как увеличивается количество расширений/mime. Я также считаю, что должен быть/лучший способ сделать это. Есть идеи?

ответ

0

Не совсем, вам по-прежнему нужен словарь/карта где-нибудь в какой-то момент.

Мой первый комментарий: вы не должны смешивать MIME и расширения файлов на одной карте. Вместо этого, вы должны иметь 2 карты:

extensionToMime = {}; 
mimeToExtension = {}; 

Второй комментарий, что 1 абонент может иметь более 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, которые могут быть легко построить, как это.

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; 
    } 
}