簡體   English   中英

無法在 Javascript 中讀取未定義錯誤消息的屬性“長度”

[英]Cannot read property 'length' of undefined error message in Javascript

我正在嘗試解決關於代碼戰爭的代碼挑戰,但不明白為什么當我嘗試運行它時會收到關於數組內字符串的.length的錯誤消息。

它絕對是第 7 行中的第一個.length 。我試過運行其他arr[i].lengths並且它們工作,我認為這是范圍的問題?

 function longestConsec(strarr, k) { var arr = []; if (strarr.length == 0 || k > strarr.length || k <= 0) { return ""; } for (var i = 1; i <= strarr.length; i++) { if (strarr[i].length > strarr[0].length && arr.length < k) { arr.push(strarr[i]); } } arr.join(''); } longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2);

應該返回"abigailtheta"因為它是第一個字符串之后的兩個最長字符串,這是要求。

VM304:7 未捕獲的類型錯誤:無法讀取未定義的屬性“長度”

數組中的元素從 0 到length - 1

數組中有 6 個字符串,最后一個的索引為 5。

因為當索引strarr.length等於strarr.length時您應該迭代的條件集,它會嘗試迭代不存在的第 6 個元素。

您應該更改迭代條件:

for (var i = 1; i < strarr.length; i++) {

 function longestConsec(strarr, k) { var arr = []; if (strarr.length == 0 || k > strarr.length || k <= 0) { return ""; } for (var i = 1; i < strarr.length; i++) { if (strarr[i].length > strarr[0].length && arr.length < k) { arr.push(strarr[i]); } } arr.join(''); alert(arr); } longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2);

您正在使用錯誤的邊界迭代數組。

您應該將其更改為 strarr.length - 1。

或刪除小於或等於並僅使用小於運算符

因為數組中最后一個可訪問元素的索引是數組長度減1

正如所指出的,您迭代了太多次。 您的最后一次迭代將嘗試訪問數組中不存在的索引。

除此之外,您的代碼似乎不像您描述的那樣執行。 它在任何時候都不會處理“最長”,而只是抓取比第一個長的前兩個字符串。

如果您想找到組合最長長度的連續字符串,請考慮以下內容:

 function longestConsec(strarr, k) { //invalid - exit if (strarr.length === 0 || k > strarr.length || k <= 0) return ""; return strarr.reduce((out, str, idx, arr) => { if (idx+k > arr.length) arr.splice(1); //exit early if at end of array let substring = arr.slice(idx,idx+k).join(""); //combine next k items into a string if (substring.length > out.length) { //if it's the longest out.length = substring.length; //save the length out.str = substring; //save the string } return out; }, {length: 0, str: ""}); } var longest = longestConsec(["one", "seventeen", "four", "nineteen", "eleven", "five", "sixteen", "thirteen", "fourteen", "six"], 3); console.log(longest);
 .as-console-wrapper {max-height: none !important; top: 0;}

這在效率方面有改進的空間,因為每次調用.slice()並不是完全必要的,但無論如何我相信結果更符合您的任務。

您的迭代次數超過允許的次數:

for (var i = 1; i < strarr.length; i++) {
  if (strarr[i].length > strarr[0].length && arr.length < k) {
    arr.push(strarr[i]);
  }
}
arr.join('');
console.log(arr)

一個有效的堆棧閃電戰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM