繁体   English   中英

为什么我会收到“未捕获的类型错误:无法读取 undefined(...) 的属性‘长度’”?

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

错误消息:未捕获的类型错误:无法读取 undefined(...) 的属性“长度”

第 44 行,第 23 列

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

我正在尝试获取一个字符串并将其转换为一个数组数组,该数组被格式化为采取步骤的形状(codewars 的 kata); 一个字横着,下一个字往下,依此类推。 我遇到的问题是,当尝试在 for 循环中使用数组元素的长度时,我不断收到 Uncaught TypeError: Cannot read property 'length' of 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 += even[i+1].length - 1;” (我已经尝试了大约一千种不同的方法)我得到了错误,但是如果我返回那行“return even[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("Life is good for us"); 此调用将正确填充数组,您不会收到任何错误。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM