2014-10-16 4 views
0

У меня есть два вложенных цикла; в основном то, что я пытаюсь сделать, это вставить несколько строк внутри массива, который содержит строки текста;JS - неопределенный объект (но объект определен)

Чай заполнителя

'// <<<PERMISSIONS TREE>>>' 

и вставить несколько строк сразу после него; прежде чем сделать это, я проверяю, если некоторые линии уже есть после выполнения указанных выше заполнителем и перед

'// <<<END PERMISSIONS TREE>>>' 

В этом случае мне нужно сначала удалить эти строки, а затем вставьте новые

for(i = 0; i < lines.length; i++) { 
    if (lines[i].indexOf('// <<<PERMISSIONS TREE>>>') >= 0) { 

     i++; 
     var j = i; 
     console.log(lines[j]);  //here lines[j] is defined and printed on screen correctly 
     console.log(lines[j].indexOf('// <<<END PERMISSIONS TREE>>>')); //this also works 

     //start delete loop - the following line doesn't work 
     while ((lines[j].indexOf('// <<<END PERMISSIONS TREE>>>') < 0) && (j < lines.length)) { 
      lines.splice(j, 1); 
      j++; 
     } 

     lines.splice(i , 0, result); // insert result in the correct place, this works 
     break; 
    } 
} 

В линия, где я начинаю время цикла, я получаю ошибку:

Cannot call method 'indexOf' of undefined 

, но две строки выше (бревен) работ; Я просто не могу понять, почему ...

Этот код работает в nodejs, не знаю, имеет ли это значение;

+0

Как насчет того, когда 'i' равно' lines.length - 1', а затем вы увеличиваете его на 1 и пытаетесь посмотреть на 'lines [j]' после этого? – Pointy

+0

Также в этом цикле 'while' вы проверяете' .indexOf() '** перед **, вы проверяете, находится ли' j' в диапазоне! – Pointy

+0

Тогда значение * не * "определено". Двигатель JS прав. Вы неправы. Исправьте/обновите утверждение (и заголовок). В чем проблема? При необходимости используйте отладчик. – user2864740

ответ

6

При удалении элемента из массива и сдвиге индекса каждого элемента после него на один. Если вы затем увеличиваете свой индекс j, вы совершаете ошибку «один за другим».

arr = [1, 2, 3]; 
arr[1]; // 2 
arr.splice(1, 1); // arr is now [1, 3] 
arr[1]; // 3 
arr.splice(1, 1); // arr is now [1] 
arr[1]; // undefined 

Вы можете избежать этого, просто не увеличивающиеся j, так как он теперь со ссылкой на новый элемент массива, который является то, что вы хотите.

+0

Это правильно! Я выходил за пределы диапазона с индексом –

+0

Также предложение Amadan полезно, поскольку проверка индекса на длину массива перед проверкой остатка, избегайте всего, чтобы сбой, если по какой-то причине отсутствует второй заполнитель –

3

Reverse следующим условиям:

while ((j < lines.length) && (lines[j].indexOf('// <<<END PERMISSIONS TREE>>>') < 0)) { 

Причиной ошибки является то, что вы сначала попробуйте использовать lines[j], и только после того, как проверить, является ли j является законным.

Также может быть несвязанная логическая ошибка, описанная Крисом Хейсом. Обратите внимание, что даже без увеличения j, если строковый блок не завершен, вы столкнетесь с той же ошибкой.

+1

Хороший улов. Я был укушен «сращиванием» столько раз, что даже не рассматривал эту часть. –

Смежные вопросы