Javascript, если оператор с несколькими допустимыми условиями

Возможный дубликат:
Javascript: самый красивый способ сравнить одно значение с несколькими значениями
Javascript Если оператор, используемый для проверки неработающих файлов, не работает

В JS я пытаюсь проверить, заканчивается ли расширение в "png" "jpg" или "gif". Я знаю, что это можно сделать с помощью оператора switch, но мне интересно, есть ли более простой способ сделать все это в условном выражении if. Как:

    if (aExtensions[i].toLowerCase() == ('jpg' || 'png' || 'gif')) {}

Какой лучший способ достичь этого?

Ответ 1

Вы можете использовать такой массив:

var extensions = ["jpg", "png", "gif"];

if (extensions.indexOf(aExtensions[i].toLowerCase()) > -1) {
    // match
}

В этом случае вы сохраняете "действительные" расширения. Затем вы можете использовать метод indexOf Array, чтобы узнать, соответствует ли какой-либо из элементов массива конкретному расширению, на который вы смотрите, - проверка значения 0 или больше.

indexOf не поддерживается в старых браузерах, поэтому вам нужно будет включить polyfill для резервного копирования... вы можете взглянуть на https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility, но для этого есть несколько решений.

Конечно, если вы хотите использовать только инструкции if, вы можете использовать этот формат:

var ext = aExtensions[i].toLowerCase();
if (ext == "jpg" || ext == "png" || ext == "gif") {
    // match
}

Еще одна возможность, о которой я могу думать, - это оператор switch, например:

var ext = aExtensions[i].toLowerCase();

switch (ext) {
    case "jpg":
    case "png":
    case "gif":
        // match
        break;
    case default:
        // No match
}

Я мог бы также включить его (другие ответы были первыми, определенно), но еще один, о котором я могу думать, - это использовать регулярное выражение, например:

if (/jpg|png|gif/i.test(aExtensions[i])) {
    // match
}

Но обратите внимание, что вы никогда не сможете индивидуально получить расширения обратно, и поэтому я предпочел бы один из первых двух вариантов, которые я дал.

Ответ 2

Как насчет регулярного выражения?

if ( /jpg|png|gif/i.test( aExtensions[i] ) ) {
  ...
}

Ответ 3

Еще один способ сделать это - использовать литерал объекта, подобный этому,

if ({'jpg':1,'png':1,'gif':1}[aExtensions[i].toLowerCase()]) {
    // ...
}

Таким образом, вы хотите узнать, имеет ли анонимный объект {'jpg':1,'png':1,'gif':1} свойство, которое будет истинно с помощью if. 1 соответствует этому, undefined не делает.


Если вы используете объект, вы также можете использовать оператор in (как указано Ian), который дает true, если объект имеет такой ключ, который не имеет значения для него.

if (aExtensions[i].toLowerCase() in {'jpg':0,'png':1,'gif':2}) {
    // ...
}

Обратите внимание на этот раз, как 'jpg' все еще проходит, хотя 'jpg':0.

Ответ 4

Вы можете использовать переменное и тройное сравнение, но это уродливо.

Или вы можете просто использовать массив и проверить, содержится ли в нем строка.

if (~ ["jpg", "png", "gif"].indexOf(aExtensions[i].toLowerCase()) …

Тем не менее, для сложного сравнения != -1 и отсутствия встроенного indexOf в старых IE, люди склонны использовать регулярные выражения:

if (/jpg|png|gif/i.test(aExtensions[i])) …