JS - 未定义的对象(但定义了对象)

时间:2014-10-16 02:41:37

标签: javascript

我有两个嵌套的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中运行,不知道这是否重要;

2 个答案:

答案 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,如果字符串块未终止,您也会遇到相同的错误。