我有两个嵌套的for循环;基本上我要做的是在包含文本行的数组中插入一些行;
我寻找占位符
'// <<<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;
}
}
在我启动while循环的行中,我收到错误:
Cannot call method 'indexOf' of undefined
但上面的两行(日志)有效;我只是不明白为什么......
此代码在nodejs中运行,不知道这是否重要;
答案 0 :(得分:6)
当你splice
时,你从数组中删除一个元素,然后将每个元素的索引向下移动一个。如果您然后递增索引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
来避免这种情况,因为它现在指的是数组的新元素,这就是你想要的。
答案 1 :(得分:3)
反转条件如下:
while ((j < lines.length) && (lines[j].indexOf('// <<<END PERMISSIONS TREE>>>') < 0)) {
出现错误的原因是您首先尝试使用lines[j]
,并且只有在检查j
是否合法之后才会这样做。
Chris Hayes描述的可能还存在无关的逻辑错误。请注意,即使没有递增j
,如果字符串块未终止,您也会遇到相同的错误。