[英]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.