цикл javascript не повторяется на втором счетчике

1

Я просто искал javascript, я просто пытаюсь сравнить 2 массива и удалить все английские гласные из строки, чтобы позже вернуть его без гласных.

Итерация для j представляющая массив гласных (arr), прекращается, но я хочу, чтобы она повторялась на каждой итерации для i.

Вот мой базовый код:

let sentence = 'eitan was here';

function disemvowel(str) {
  let arr = ['a', 'e', 'i', 'o', 'u'];
  let letters = str.split('');
  let i, j;
  for (i = 0, j = 0; i < letters.length && j < arr.length;) {
    console.log('counter: i = ' + i + ', j = ' + j + ', ' + letters[i] + ' vs ' + arr[j] + 'and letters: ' + letters);
    if (letters[i] == arr[j]) {
      if (letters[i] == ' ') {
        i++;
      }
      console.log('IF stopped here: ' + letters[i] + ' at i: ' + i + ', ' + arr[j] + ' at j: ' + j);
      letters.splice(i, 1);
      //console.log('letters after splice: '+ letters);
      i++;
    } else {
      console.log('ELSE stopped here: ' + letters[i] + ' at i: ' + i + ', ' + arr[j] + ' at j: ' + j);
      j++;
    }
  }
  return letters;

}
console.log('letters are: ', disemvowel(sentence));
Мне интересно избежать создания циклов внутри циклов или отдельных функций для запуска j для времени выполнения и краткости.
  • 1
    « Мне интересно избегать создания циклов внутри циклов ». Да, они являются мощным инструментом.
  • 0
    @Teemu, правда, но у меня такое ощущение покалывания, что в этом нет необходимости, я прав?
Показать ещё 7 комментариев
Теги:
loops

3 ответа

1
Лучший ответ
sentence = 'eitan was here';
function disemvowel(str){
arr = ['a','e','i','o','u'];

arr.forEach((itm)=>{
    var re = new RegExp(itm,'g');
    str = str.replace(re,'');
})
return str;
}
console.log(disemvowel(sentence));
  • 0
    Люблю код, используя один цикл foreach, очень приятно.
  • 0
    спасибо, надеюсь, это решит вашу проблему с использованием одного цикла
3

Вам не нужно зацикливаться, чтобы удалить гласные из строки. Лучший способ добиться этого - использовать класс символов в replace() как это

let sentence = 'eitan was here';
sentence  = sentence .replace(/[aeiou]/g,'');

Вы также можете использовать оператор OR (|), как это

sentence = sentence.replace(/a|e|i|o|u/g,''); 
  • 0
    отличный ответ, но мне нужно придерживаться цикла.
  • 0
    Не могли бы вы отметить это и проголосовать, чтобы другие знали, что это правильный ответ.
Показать ещё 2 комментария
0

Вы должны сбросить j на 0. Кроме того, вы не можете сплайсировать тот же массив, который вы зацикливаете, т.е. массив букв в этом случае.

<script>
 let sentence = 'eitan was here';
 function disemvowel(str) {
  let arr = ['a', 'e', 'i', 'o', 'u'];
  let letters = str.split('');
  let output = [];
  let i,j;
 for (i=0,j=0; i<letters.length && j<arr.length;){
    if(letters[i] == arr[j]){
        j = 0;
        i++;
    }else{
        j++;
        if(j >= arr.length){
            output.push(letters[i]);
            i++;
            j = 0;
        }
     }
   }
  return output;
 }
 console.log('letters are: ', disemvowel(sentence));
</script>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню