Проверка на гласные и согласные буквы

559
01 июля 2017, 12:49

Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная - то две. В итоге должно получится слово 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) 
}

Answer 1

Наличие символа в массиве гласных можно делать с помощью 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);

Answer 2

Ошибка в логике: вместо того, чтобы определить гласная буква или согласная, на каждую букву 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) 
}

Answer 3

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

Answer 4
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);
READ ALSO
Как с помощью JS очистить ошибки p:calendar

Как с помощью JS очистить ошибки p:calendar

Я написал JS функцию по очищению ошибок p:календарь, если были введены неверные данные в поле календаря (вручную заполнили поле календаря)...

234
Fabrik &gt; Как прервать создание элементов с определенным классом

Fabrik > Как прервать создание элементов с определенным классом

Используется компонент Fabrik, он создает элемент календарь для всех элементов с датой

200
Полосатая таблица

Полосатая таблица

Нужно сделать полосатую таблицуВсе было бы довольно просто, но мою таблицу генерирует js с помощтю такого метода:

216