Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

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

#javascript #jquery


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



    


Ответы

Ответ 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);

Ответ 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) }

Ответ 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);

Ответ 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);

Ответ 5



=> что-то типа того, осмысленней и по-современней, чем предлагали выше: { 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, [] ) }

Комментариев нет:

Отправить комментарий