簡體   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