Как найти все гласные в строке js

I’m supposed to write a function that takes a character (i.e. a string of length 1) and returns true if it is a vowel, false otherwise. I came up with two functions, but don’t know which one is better performing and which way I should prefer. The one with RegEx is way simpler but I am unsure whether I should try to avoid using RegEx or not?

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

With RegEx:

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

Penny Liu's user avatar

Penny Liu

14.8k5 gold badges78 silver badges93 bronze badges

asked Mar 30, 2011 at 14:55

Max's user avatar

3

benchmark

I think you can safely say a for loop is faster.

I do admit that a regexp looks cleaner in terms of code. If it’s a real bottleneck then use a for loop, otherwise stick with the regular expression for reasons of “elegance”

If you want to go for simplicity then just use

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

Marz's user avatar

answered Mar 30, 2011 at 15:01

Raynos's user avatar

RaynosRaynos

166k56 gold badges350 silver badges396 bronze badges

7

Lots of answers available, speed is irrelevant for such small functions unless you are calling them a few hundred thousand times in a short period of time. For me, a regular expression is best, but keep it in a closure so you don’t build it every time:

Simple version:

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

More efficient version:

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

Returns true if s is a single vowel (upper or lower case) and false for everything else.

Community's user avatar

answered Mar 30, 2011 at 23:39

RobG's user avatar

RobGRobG

141k31 gold badges172 silver badges209 bronze badges

4

cycles, arrays, regexp… for what? It can be much quicker 🙂

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

answered Mar 30, 2011 at 15:14

Emmerman's user avatar

EmmermanEmmerman

2,37115 silver badges9 bronze badges

7

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

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

Basically it returns all the vowels in a given string.

answered Jun 10, 2017 at 15:01

José Salgado's user avatar

This is a rough RegExp function I would have come up with (it’s untested)

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

Which means, if (char.length == 1 && 'aeiou' is contained in char.toLowerCase()) then return true.

answered Mar 30, 2011 at 15:05

Buhake Sindi's user avatar

Buhake SindiBuhake Sindi

87.5k29 gold badges167 silver badges227 bronze badges

Personally, I would define it this way:

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

You could also use ['a','e','i','o','u'] and skip the length test, but then you are creating an array each time you call the function. (There are ways of mimicking this via closures, but those are a bit obscure to read)

bpierre's user avatar

bpierre

10.8k2 gold badges25 silver badges27 bronze badges

answered Mar 30, 2011 at 15:01

cwallenpoole's user avatar

cwallenpoolecwallenpoole

79.3k26 gold badges128 silver badges166 bronze badges

1

I kind of like this method which I think covers all the bases:

const matches = str.match(/[aeiou]/gi);
return matches ? matches.length : 0;

Břetislav Hájek's user avatar

answered Apr 8, 2019 at 11:16

Intellidroid's user avatar

IntellidroidIntellidroid

1,0431 gold badge9 silver badges15 bronze badges

1

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

    return isVowel;
  }
}

Basically it checks for the index of the character in the string of vowels. If it is a consonant, and not in the string, indexOf will return -1.

answered Mar 30, 2011 at 15:00

Håvard's user avatar

HåvardHåvard

9,7901 gold badge41 silver badges46 bronze badges

2

Basically it returns all the vowels in a given string.

function vowels(s) {
  let vowels = ["a", "e", "i", "o", "u"];

  for(let v of s) {
    if(vowels.includes(v))
        console.log(v);
  }
}

answered Aug 25, 2021 at 5:58

Madhusanka Edirimanna's user avatar

This is the way I did it, on the first occurrence of a vowel in any given word it breaks out of the loop and returns true.

const vowels = ["a", "e", "i", "o", "u", "y"];

function isVowel(word) {
    let result = false;
    for (let i = 0; i < word.length; i++) {
        if (vowels.includes(word[i])) {
            result = true;
            break;
        }
    }
    return result;

answered Apr 23, 2021 at 14:01

Yuniac's user avatar

YuniacYuniac

3233 silver badges11 bronze badges

1

I created a simplified version using Array.prototype.includes(). My technique is similar to @Kunle Babatunde.

const isVowel = (char) => ["a", "e", "i", "o", "u"].includes(char);

console.log(isVowel("o"), isVowel("s"));

answered May 17, 2020 at 13:34

Penny Liu's user avatar

Penny LiuPenny Liu

14.8k5 gold badges78 silver badges93 bronze badges

  //function to find vowel
const vowel = (str)=>{
  //these are vowels we want to check for
  const check = ['a','e','i','o','u'];
  //keep track of vowels
  var count = 0;
  for(let char of str.toLowerCase())
  {
    //check if each character in string is in vowel array
    if(check.includes(char)) count++;
  }
  return count;
}

console.log(vowel("hello there"));

answered Jun 13, 2018 at 17:31

Kunle Babatunde's user avatar

1

Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная – то две.
В итоге должно получится слово hello. Проблема в том, что значение в pos после первого раза не меняется, как это поправить?

var str = "hieeelalaooo"; //строка
var vowels = "aeiouy"; //гласные
var pos=0, res;
var res = str.charAt(0);
for (var i = 0; i <= str.length; i++) {
  for (var j = 0; j <= vowels.length; j++) {
    if (pos == i) continue;//если есть позиция букву которой мы взяли то пропускаем 
    if (str[i] != vowels[j]) {//если согласная то 
      pos = i + 2;//позиция увеличивается на два
    } else {
      pos = i + 3;//если гласная то на три
    }
  }
  res += str[pos];//получаем букву
  console.log(res)
}

задан 30 июн 2017 в 11:15

J.Joe's user avatar

J.JoeJ.Joe

611 золотой знак1 серебряный знак3 бронзовых знака

7

Наличие символа в массиве гласных можно делать с помощью indexOf, т.е. по факту вам не нужны 2 цикла с тремя счетчиками.

var str = "hieeelalaooo"; //строка
var vowels = "aeiouy"; //гласные
var pos, res = "";
var i = 0;
while (i < str.length) {
  res += str[i];
  if(vowels.indexOf(str[i]) > -1) {
    i += 3;
  } else {
    i += 2;
  }
}
console.log(res);

ответ дан 30 июн 2017 в 11:24

br3t's user avatar

br3tbr3t

4,3794 золотых знака16 серебряных знаков29 бронзовых знаков

6

Ошибка в логике: вместо того, чтобы определить гласная буква или согласная, на каждую букву pos меняется столько раз, сколько букв в массиве vowels

Кроме этого:

  • проблемы со счетчиками (i <= str.length;, j <= vowels.length;) – в случае когда счетчик равен str.length, str[i] будет равен undefined, так как индексация идет с нуля.

  • строка res меняется после изменения pos, но до проверок, что pos не выходит за границы строки. Поэтому в конце результата выводится много undefined

  • if (pos == i) continue; – бесполезное условие, которое всегда false

  • непонятно как связан счетчик i с переменной pos.


Если убрать недочеты, то может получиться так:

// Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная - то две.
var str = "hieeelalaooo"; //строка
var vowels = "aeiouy"; //гласные
var res = '';
for (var pos = 0; pos < str.length;) {
  res += str[pos];
  var isVowels = false;
  for (var j = 0; j < vowels.length; j++) { // проверяем тип буквы
    if (str[pos] == vowels[j]) { // если гласная
      isVowels = true; // выставляем флаг
      break; // выходим 
    }
  }
  if (isVowels) {
    pos += 3;
  } else {
    pos += 2;
  }
  console.log(res)
}

вместо внутреннего цикла, можно воспользоваться методом indexOf как в ответе @br3t

либо перевести строку в объект, с ключами соответствующими гласным буквам и использовать его:

// Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная - то две.
var str = "hieeelalaooo"; //строка
var vowels = "aeiouy".split('').reduce((acc, el) => acc[el] = true && acc, {}); //гласные
var res = '';
for (var pos = 0; pos < str.length;) {
  res += str[pos];
  if (vowels[str[pos]]) {
    pos += 3;
  } else {
    pos += 2;
  }
  console.log(res)
}

ответ дан 30 июн 2017 в 11:48

Grundy's user avatar

GrundyGrundy

79.9k9 золотых знаков76 серебряных знаков133 бронзовых знака

var str = "hieeelalaooo"; //строка
var vowels = "aeiouy"; //гласные
var vowels = new Set(vowels.split(''));
var res = '';
for (var i = 0; i < str.length; i++) {
  if (str[i] === ' ')
    res += str[i++];
  res += str[i];
  i = vowels.has(str[i]) ? i + 2 : i + 1;
}
console.log(res);

br3t's user avatar

br3t

4,3794 золотых знака16 серебряных знаков29 бронзовых знаков

ответ дан 30 июн 2017 в 12:01

J.Joe's user avatar

J.JoeJ.Joe

611 золотой знак1 серебряный знак3 бронзовых знака

7

var str = "hieeelalaooo";
var vowels = 'aeiouy';
var word = '';
for (var i = 0; i < str.length; i++) {
  if (str[i] == ' ') {
      word += ' ';
  } else if(vowels.indexOf(str[i]) > -1 ) {
      word += str[i];
      i += 2;
  } else {
      word += str[i];
      i++;
  }
}
console.log(word);

ответ дан 30 июн 2017 в 12:55

edithpifpaf's user avatar

edithpifpafedithpifpaf

251 серебряный знак8 бронзовых знаков

=> что-то типа того, осмысленней и по-современней, чем предлагали выше:

{
const str = "hieeelalaooo"; //строка
const glass = "aeiouy"; //гласные
const res = [];

str.split('').forEach(e=>
  glass.split('').includes(e) && !res.includes(e) ? res.push(e):''
)
console.log('гласные не повторяющиеся -> '+res.join(''));
}

///////еще короче:

{
const str = "hieeelalaooo"; //строка
const glass = "aeiouy"; //гласные

str.split('').reduce( (sum,e) =>glass.split('').includes(e) && !sum.includes(e) && sum.push(e)&&sum||sum, []
)
}

ответ дан 30 июн 2019 в 11:13

kostia7alania's user avatar

В этом блоге я буду писать об алгоритме гласных, который требует, чтобы мы возвращали количество гласных, используемых в строке. Просто, верно? Что ж, приступим! Давайте начнем с того, что всегда будем писать объявление нашей функции, и у нас будет один параметр — строка. После того, как мы это сделали, мы хотим иметь счетчик, поэтому мы установим переменную с именем counter в 0. Пока что наш код должен выглядеть так:

После этого мы хотим поместить все наши гласные в массив, чтобы при проверке каждого символа строки мы могли использовать метод .includes(), чтобы проверить наличие гласных. После того, как мы создали переменную с именем vowels для каждой гласной в массиве как отдельный элемент, мы хотим запустить цикл for. наш заданный аргумент «str». Мы хотим, чтобы вся наша строка была в нижнем регистре , поэтому мы сделаем str.toLowerCase(), чтобы наш цикл for выглядел как for(let char of str.toLowerCase()), потому что наш массив гласных весь в нижнем регистре . При этом наш код должен выглядеть примерно так:

Теперь в нашем цикле for мы хотим сделать условие. Наш условный оператор проверит, содержит ли наш char какую-либо из заданных гласных в нашем массиве гласных. Если он включает гласную, мы хотим увеличить наш счетчик. После того, как мы это сделали, вне цикла for, мы хотим вернуть нашу переменную счетчика. После этого наш код будет выглядеть так:

Надеюсь, вам понравился этот простой алгоритм проверки гласных на JavaScript! Надеюсь, это поможет вам лучше понять JavaScript!

Старый

14.01.2014, 20:38

Новичок на форуме

Отправить личное сообщение для baks1k93

Посмотреть профиль

Найти все сообщения от baks1k93

 

Регистрация: 14.01.2014

Сообщений: 2

Получить гласные из текста

Требуется получить глассные из текста. Код не работает, почему?

[ js ]
function getWowel(arr){
var result = [];
var op = arr.split(”);

for (var i=0; i<op.length; i++){
if (op[i] == ‘а’ || ‘у’ || ‘о’ || ‘ы’ || ‘и’ || ‘э’ || ‘я’ || ‘ю’ || ‘ё’ || ‘е’){
result.push( op[i] )
}
}
alert(result.join(”));
}
var array = ‘получить гласные’;
getWowel(array);
[ /js ]

Ответить с цитированием

Старый

14.01.2014, 21:46

Профессор

Отправить личное сообщение для Rise

Посмотреть профиль

Найти все сообщения от Rise

 

Регистрация: 07.11.2013

Сообщений: 4,611

if (op[i]=='а' || op[i]=='у' || op[i]=='о' || op[i]=='ы' || op[i]=='и' || op[i]=='э' || op[i]=='я' || op[i]=='ю' || op[i]=='ё' || op[i]=='е') { .....

Ответить с цитированием

Старый

14.01.2014, 22:00

Новичок на форуме

Отправить личное сообщение для baks1k93

Посмотреть профиль

Найти все сообщения от baks1k93

 

Регистрация: 14.01.2014

Сообщений: 2

Спасибо !

Ответить с цитированием

Я должен написать функцию, которая принимает символ (т.е. строку длиной 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);
  }
}

30 март 2011, в 17:32

Поделиться

Источник

7 ответов

ориентир

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

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

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

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

Raynos
30 март 2011, в 16:14

Поделиться

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

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

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 для всего остального.

RobG
31 март 2011, в 00:08

Поделиться

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

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

Emmerman
30 март 2011, в 15:29

Поделиться

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

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

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

cwallenpoole
30 март 2011, в 16:37

Поделиться

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

    return isVowel;
  }
}

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

Håvard
30 март 2011, в 15:25

Поделиться

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

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

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

Buhake Sindi
30 март 2011, в 15:24

Поделиться

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

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

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

José Salgado
10 июнь 2017, в 15:40

Поделиться

Ещё вопросы

  • 0Анимация относительных спрайтов в CSS
  • 0Не удалось изменить объект javascript
  • 0KineticJS – передать элемент DOM в конструктор
  • 1ошибка при попытке использовать keras.utils.plot_model
  • 0JQuery выберите раскрывающийся список выбранного значения
  • 0Преобразуйте MySql InputStream в byte []
  • 0Ошибка C ++ LNK2019
  • 0Как добавить – массив в объект mongodb + угловой + узел
  • 0Некоторые основные вопросы о JWT (на стороне сервера и клиента)
  • 0Как я могу перенаправить с нового URL на предыдущий URL в веб-просмотре, используя angularjs?
  • 0Один пользователь несколько адресов доставки, как сделать это по умолчанию
  • 1Ошибка: не найдено метаданных NgModule для ‘undefined’ в Angular2
  • 1Запустите сервис FireBase вручную
  • 0Сам триггерный элемент JQuery в привязке
  • 1Проблемы новичка с Eclipse и запуска импортированного файла .jar?
  • 1Плагин соглашения Struts2 не работает в EAR, но отлично работает в WAR
  • 1DataOutputStream.writeBytes добавляет ноль байтов
  • 0Таблица отношений не обновляется, когда я вставляю записи
  • 0Базовый калькулятор jQuery
  • 0сохранить изменения из таблицы JSP в базу данных
  • 1Различать подклассы с помощью equals & hashcode
  • 0Смена рабочего каталога PHP, PostgreSQL не работает в Windows
  • 0Вызовите функцию jquery, используя атрибут onclick, который передаст функции this
  • 1Открытие JFrame из другого пакета в главном окне
  • 0Вставить несколько столбцов JSON в MySQL (используя API)
  • 0удалить дубликаты на левой таблице, сохраняя дубликаты на правой таблице SELECT JOIN
  • 0используя один и тот же вид на страницах
  • 0Увеличьте число и сбросьте счетчик на следующий день
  • 1Не удается найти jfxrt.jar (javafx) во время выполнения
  • 1составление данных формы с помощью HttpClient
  • 0Ошибки включения Android NDK с помощью cURL
  • 1Удаление активности запуска из стека на pendingIntent
  • 1Как скрыть просмотр текста после анимации
  • 1Пользовательский переход между страницами в WinRT
  • 1Решить с помощью решателя Z3 условие с длиной массива произвольного размера
  • 0опция по умолчанию в поле выбора – угловой JS
  • 1Загрузка PDF с Dropbox на телефон с заданного URI в Base64 дает сломанный нечитаемый PDF
  • 0Нажатие кнопки не срабатывает, если div движется вниз
  • 1Изображение не загружается на JTable
  • 1«Неизвестный слой: лямбда» в tenorflowjs в браузере
  • 1Интерполяция в пандах по горизонтали не зависит от каждой строки
  • 1Android обрабатывает все ограничения AlarmManager
  • 0Как передать событие, вызванное jQuery, в функцию
  • 1Откройте загруженный файл с помощью диспетчера загрузки Android
  • 2Android Studio 3.3.2 процессор аннотаций
  • 0Console.log (‘variable’) – как показать
  • 1Как получить только числовое значение в строке с помощью Regex?
  • 1Платеж Android в приложении пропущен, чтобы пометить отзыв при возврате
  • 0Заменить номер в RegEx на тот же номер
  • 0Angular SyntaxError: Неожиданный токен}

Сообщество Overcoder

Добавить комментарий