Замените букву буквой алфавита, почему в сплайсе не удаляются несколько символов - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий код.

var list = input => {
      let array = input.split('').map(ch => ch.toLowerCase().charCodeAt(0) - 96);

      for(let el in array) {
        if(array[el] < 1 || array[el] > 26)
          array.splice(el,1);
      }
      return array.toString().replace(/,/g, ' ');
    }

    console.log(list("The sun!!!set sets at twelve o' clock."));
    // output
    //20 8 5 19 21 14 -63 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 -64 3 12 15 3 11

Почему сращивание не удаляет несколько символов в строке?Специальные символы удаляются, только если они встречаются между буквами.Как изменить код для достижения только положения букв из алфавита?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы выполняете итерацию по массиву с помощью

for(let el in array)

и все еще удаляете элементы из того же массива с помощью

array.splice(el,1);

Вы не можете сделать это, потому чтоесли вы удаляете элемент, массив становится на один элемент короче, но это не отражается в вашей итерации.

Вместо этого обычно выполняйте итерацию по числовому индексу элемента (в состоянии цикла все еще проверяется текущая длина массива) и либоувеличить индекс или удалить элемент:

if(array[i] < 1 || array[o] > 26)
    array.splice(i,1)
else
    i++;
0 голосов
/ 29 ноября 2018

Использование splice () в цикле не очень хорошая идея.Вы изменяете длину того, что вы зацикливаете.

Используйте вместо этого filter(), чтобы исключить нежелательные значения.Вы также можете использовать join() с пробелом.

var list = input => {
  return input.split('')
    .map(ch => ch.toLowerCase().charCodeAt(0) - 96)
    .filter(n => n > 0 && n < 27)
    .join(' ');
}

console.log(list("The sun!!!set sets at twelve o' clock."));

Если вы хотите сплайсировать (), то безопаснее всего сделать это, работая в обратном направлении через массив

for(let i = array.length-1; i >= 0; i--) 

Тогда вы не изменитеиндексирование элементов, которые вы еще не посетили

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...