为什么我得到“未捕获的类型错误:无法读取未定义(...)的属性'长度'".

Why do I get "Uncaught TypeError: Cannot read property 'length' of undefined(…)"?

本文关键字:未定义 读取 属性 quot 长度 为什么 错误 类型      更新时间:2023-09-26

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

44 行,第 23 列

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

我试图把一个字符串变成一个数组数组,它的

格式被格式化为步骤的形式(codewars的kata);一个单词横跨,下一个单词向下,依此类推。我遇到的问题是我不断收到一个未捕获的类型错误:尝试在 for 循环中使用数组元素的长度时,无法读取 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;    
}  

最后一行是"start2 += 偶数[i+1].length - 1;"(我已经尝试了大约一千种不同的)我收到错误,但是如果我返回该行"返回偶数[i+1].length - 1;"我得到 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;    
    }
}

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

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

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将始终小于 even.length 。代码中没有任何内容可以确保这一点,事实上,它通常不是真的。 masterStringOdd.length 是作为字符串连接在一起的 odd 数组条目的长度; even.lengtheven条目的数量。因此,even.length可能至少没有masterStringOdd.length那么大有两个原因:1。后者是字符串的长度,而不是数组;和 2.后者与odd有关,而不是even

代码的问题在于,在访问偶数组和奇数组之前,您没有检查它们的长度。如果您在 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("生活良好");,如果不应用适当的长度检查,您将在代码中看到问题

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