Как проверить гласные в JavaScript?

Я должен написать функцию, которая принимает символ (т.е. строку длиной 1) и возвращает true, если это гласный, иначе false. Я придумал две функции, но не знаю, какой из них лучше выполнять, и каким образом я должен предпочесть. Тот, у кого есть RegEx, намного проще, но я не уверен, следует ли пытаться избежать использования RegEx или нет?

Моя попытка без RegEx:

function isVowel(char)
{
  if (char.length == 1)
  {
    var vowels = new Array('a','e','i','o','u');
    var isVowel = false;

    for(e in vowels)
    {
      if(vowels[e] == char)
      {
        isVowel = true;
      }
    }

    return isVowel;
  }
}

С RegEx:

function isVowelRegEx(char)
{
  if (char.length == 1)
  {
    return /[aeiou]/.test(char);
  }
}

Ответ 1

ориентир

Я думаю, вы можете смело сказать, что цикл for работает быстрее.

Я признаю, что регулярное выражение выглядит более понятным с точки зрения кода. Если это реальное узкое место, то используйте цикл for, иначе придерживайтесь регулярного выражения по причинам "элегантности"

Если вы хотите пойти на простоту, просто используйте

function isVowel(c) {
    return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1
}

Ответ 2

Потеря ответов здесь, скорость не имеет значения для таких небольших функций, если вы не назовете их несколько сотен тысяч раз за короткий промежуток времени. Для меня правильное выражение лучше всего, но держите его в закрытии, чтобы вы не собирали его каждый раз:

Простая версия:

function vowelTest(s) {
  return (/^[aeiou]$/i).test(s);
}

Более эффективная версия:

var vowelTest = (function() {
  var re = /^[aeiou]$/i;
  return function(s) {
    return re.test(s);
  }
})();

Возвращает true, если s - это один гласный (верхний или нижний регистр) и false для всего остального.

Ответ 3

циклы, массивы, регулярное выражение... для чего? Это может быть намного быстрее:)

function isVowel(char)
{
    return char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u' || false;
}

Ответ 4

Лично я бы определил его так:

function isVowel( chr ){ return 'aeiou'.indexOf( chr[0].toLowerCase() ) !== -1 }

Вы также можете использовать ['a','e','i','o','u'] и пропустить тест длины, но затем вы создаете массив каждый раз, когда вы вызываете функцию. (Есть способы имитировать это путем закрытия, но это немного неясно, чтобы читать)

Ответ 5

function isVowel(char)
{
  if (char.length == 1)
  {
    var vowels = "aeiou";
    var isVowel = vowels.indexOf(char) >= 0 ? true : false;

    return isVowel;
  }
}

В основном он проверяет индекс символа в строке гласных. Если это согласный, а не в строке, indexOf вернет -1.

Ответ 6

Это грубая функция RegExp, которую я бы придумал (она не проверена)

function isVowel(char) {
    return /^[aeiou]$/.test(char.toLowerCase());
}

Это означает, что if (char.length == 1 && 'aeiou' is contained in char.toLowerCase()) then return true.

Ответ 7

function findVowels(str) {
  return (str.match(/[aeiou]/ig)||[]);
}

findVowels('abracadabra'); // 'aaaaa'

В основном он возвращает все гласные в заданной строке.