Путаница «Потенциального бесконечного цикла»

#javascript #arrays #for-loop #infinite-loop #array-splice

#javascript #массивы #для цикла #бесконечный цикл #соединение массива

Вопрос:

Когда я запускаю приведенную ниже функцию, я получаю эту ошибку:

«Ошибка: потенциальный бесконечный цикл».

Проблема, похоже, в «0», который я использую в методе splice, потому что, когда я меняю его на любое другое число (1-9), я не получаю эту ошибку.

Я не уверен, как это создаст бесконечный цикл.

Является ли «0», который я использую в методе сращивания, путаницей с «i» или чем-то еще?

Помощь очень ценится, спасибо.

 function spinalCase(str) {
  var array = str.split("");
  for (i = 0; i < array.length; i  ) {
    if (array[i] !== array[i].toLowerCase()) {
      array.splice(i, 0, " ");
    }
  }
  return array;
}
spinalCase('AllThe-small Things');
  

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

1. Прочитайте о синтаксисе Array#splice

2. с какой целью array.splice(i, 0, " "); вы хотите заменить текущий элемент пробелом?

3. Ваш код вставляет новые элементы в массив, что делает array.length его больше.

4. @nnnnnn А, спасибо, я продолжу вносить изменения и посмотрю, исчезнет ли ошибка.

Ответ №1:

array.splice(i, 0, " "); говорит вставить новый элемент в текущий i индекс. Это означает, что элемент, который был at i , перемещается вверх, чтобы быть at i 1 . Итак, на следующей итерации цикла вы снова обрабатываете тот же элемент, Что приводит к другой вставке и т. Д., Навсегда.

Вы могли бы увеличить i дополнительное время внутри if блока, но я предпочитаю выполнять цикл в обратном направлении:

 function spinalCase(str) {
  var array = str.split("");
  for (i = array.length - 1; i >= 0; i--) {
    if (array[i] !== array[i].toLowerCase()) {
      array.splice(i, 0, " ");
    }
  }
  return array;
}
console.log(spinalCase('AllThe-small Things'));  

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

1. Ага! Спасибо. Главное, что я пропустил, это тот факт, что текущий элемент с индексом «i» увеличивается на единицу при использовании моего старого синтаксиса for-loop. Еще раз спасибо!