#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. Еще раз спасибо!