为什么我得到" Uncaught TypeError:无法读取属性' length'未定义的(...)"?

时间:2016-07-09 08:06:51

标签: javascript arrays for-loop

错误消息:未捕获的TypeError:无法读取属性'长度'未定义的(...)

第44行,第23栏

我已经阅读了我能找到的与此错误相关的所有帖子,但没有找到适用于这种情况的任何内容。

我试图取一个字符串并将其转换为一个数组数组,格式化为步骤形式(代码之战' kata);一个单词,下一个单词,等等。我遇到的问题是我一直遇到一个未捕获的TypeError:无法读取属性' length'尝试在for循环中使用数组元素的长度时未定义(...)所以在这个嵌套循环中:

for(var i = 0; i < masterStringOdd.length; i++){
    temp2 = proArr.slice(0);
    start2 = even[i].length - 1;
    for(let j = 0; j < odd[i].length; j++){
        let replace2 = masterStringOdd.charAt(i);
        Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
        finalOdd.push(temp2);
    }
    start2 += even[i+1].length - 1;    
}  

使用最后一行&#34; start2 + = even [i + 1] .length - 1;&#34; (我已尝试了大约一千种不同的这种情况)我得到错误,但是如果我返回那行&#34;返回甚至[i + 1] .length - 1;&#34;我得到5,这是正确的长度。我的完整代码是在这封电子邮件的最后,如果有人想看它,并相信我,我理解这是荒谬和尴尬(工作代码和完全未完成) - 手头的技能和所有这些。

在这种情况下,我无法弄清楚为什么我无法获得并使用元素长度的值。非常感谢任何帮助。

function wordStep(str) {
    let array = str.split(" "); 
    let even = [], odd = [], proArr = [], finalEven = [], finalOdd = [];
    //for loop to create sperate arrays for across and down  
    for (let i = 0; i < array.length; i++){
        if (i%2 === 0){
            even.push(array[i]);
        } else {
            odd.push(array[i].slice(1,-1));
        }
    } 
    //data collection and tool variables, might delete them if the are not    needed
    let finalLength = even.join("").toString().length - (even.length - 1);
    let masterStringEven = even.join("").toString();
    let yAxis = odd.join("").toString().length;
    let masterStringOdd = odd.join("").toString();  
    //for loop to create protype array
    for (let i = 0; i < finalLength; i++){
        proArr.push(",");
    }   
    // for loop to create final evens arrays
    let start = 0;
    for(let i = 0; i < even.length; i++){
        let temp1 = proArr.slice(0);
        let replace = even[i].split("");
        Array.prototype.splice.apply(temp1, [start, replace.length].concat(replace));
        finalEven.push(temp1);
        start += replace.length-1;;
    }
    // nested loops for final odds' array
    let temp2 = []
    let start2 = 0;

    for(var i = 0; i < masterStringOdd.length; i++){
        temp2 = proArr.slice(0);
        start2 = even[i].length - 1;
        for(let j = 0; j < odd[i].length; j++){
            let replace2 = masterStringOdd.charAt(i);
            Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
            finalOdd.push(temp2);
        }
        start2 += even[i+1].length - 1;    
    }
}

2 个答案:

答案 0 :(得分:1)

从根本上说,正在发生的事情是你要经过even数组的末尾,所以even[i]会给你undefined,然后你会尝试阅读length } undefined,导致错误。

事实上,我们可以在这个循环中看到:

for(var i = 0; i < masterStringOdd.length; i++){
    temp2 = proArr.slice(0);
    start2 = even[i].length - 1;
    for(let j = 0; j < odd[i].length; j++){
        let replace2 = masterStringOdd.charAt(i);
        Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
        finalOdd.push(temp2);
    }
    start2 += even[i+1].length - 1;    
}

...您假设masterStringOdd.length始终 <{1}}。代码中没有任何内容可以确保这一点,实际上它通常不会成立。 even.lengthmasterStringOdd.length数组的条目以字符串形式连接在一起的长度; oddeven.length个条目的数量。因此,有even可能至少与even.length一样大的原因有两个:1。后者是字符串的长度,而不是数组; 2.后者涉及masterStringOdd.length,而非odd

答案 1 :(得分:0)

您的代码的问题在于,在访问它们之前,您不会检查偶数和奇数数组的长度。如果你在wordStep(str)中有 str值,这会产生问题,这些值不会在你访问它们的索引处推送这些数组中的值。

进行适当的数组长度检查以访问特定索引处的数组。

for(var i = 0; i < masterStringOdd.length; i++){
    temp2 = proArr.slice(0);
    if(even.legth > i)
    start2 = even[i].length - 1;
    if(odd.length > i){
    for(let j = 0; j < odd[i].length; j++){
        let replace2 = masterStringOdd.charAt(i);
        Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
        finalOdd.push(temp2);
    }
    }
    if(even.length > i +1)
    {
      console.log(even.length);
      start2 += even[i+1].length - 1;  

    }
}

例如 wordStep(“生活对我们有益”); 此调用将正确填充数组,您不会收到任何错误。

但如果 wordStep(“Life Good”); ,如果未应用适当的长度检查,您将在代码中看到问题

plunker验证:http://plnkr.co/edit/QQovAAzlDhXgucikCGAb?p=preview