[英]How do I utilize the length of an array in a function (in JavaScript) when the array is being passed as a parameter and the length does not exist yet?
我正在嘗試編寫一個函數,該函數將一個字符串數組( strarr
)和一個整數( k
)作為參數,並返回由數組中k
個連續字符串組成的最長字符串,而不用逗號分隔。 我需要在函數執行過程中經常調用strarr.length
,但是我一直收到錯誤消息,說它無法讀取該參數的長度。
這是我第一次處理此問題,但是我沒有找到很好的Internet搜索結果來尋找解決方案。 我懷疑我缺少非常明顯的東西。 我嘗試將strarr
數組參數的值推入新數組,但仍然沒有運氣。
因此,如果我有const = ['apple','pineapple','banana','strawberry']
作為我的strarr
參數傳遞,2作為k
傳遞,則它應該返回'bananastrawberry'
因為它是最長的連續字符串對在數組中。
const arr = ['apple', 'pineapple', 'banana', 'strawberry'] function longestConsec(strarr, k) { if (strarr.length === 0) { return ""; } else if (k > strarr.length) { return ""; } else if (k <= 0) { return ""; } let longest = ""; let strLeng = 0; for (let i = 0; i < strarr.length; i++) { for (let j = i + (k - 1); j > 0; j--) { strLeng += strarr[j].length; } if (strLeng > longest.length) { longest = strarr.slice(i, (i + k)).join(""); } } return longest; } console.log(longestConsec(arr, 2))
如前所述,您正在嘗試訪問數組中不存在的索引。 快速修復方法可能是:
const arr = ['apple', 'pineapple', 'banana', 'strawberry']
function longestConsec(strarr, k) {
if (strarr.length === 0) {
return "";
} else if (k > strarr.length) {
return "";
} else if (k <= 0) {
return "";
}
let longest = "";
let strLeng = 0;
for (let i = 0; i < strarr.length; i++) {
for (let j = i + (k - 1); j > 0; j--) {
if (j >= strarr.length) {
break;
}
strLeng += strarr[j].length;
}
if (strLeng > longest.length) {
longest = strarr.slice(i, (i + k)).join("");
}
}
return longest;
}
console.log(longestConsec(arr, 2))
但我建議您看看是否有比添加break語句更好的解決方案。
在內部for循環中, for (let j = i + (k - 1); j > 0; j--)
,您從i + k - 1
開始計數。 但是,如果i
是數組的最后一個索引( strarr.length == 10
並且i == 9
)並且k == 2
怎么辦? 然后,循環從j = 9 + 2 - 1 = 10
strLeng += strarr[10].length
j = 9 + 2 - 1 = 10
並在下面一行,您嘗試執行strLeng += strarr[10].length
,但strarr[10]
。
在找到最長的字符串之前,似乎也不必創建字符串。 相反,您可以只記住最后一個最長字符串的開始索引。
讓我們看一下需求。 對於數組中的每個i
,您要合並k
個連續的字符串並保留最長的組合。 由此得出:
i + k - 1
不得大於strarr.length
。 由於i
是唯一的變量,因此我們需要通過循環到strarr.length - k + 1
來限制它。 k == strarr.length
,則只能創建一個字符串strarr.join("")
最后,有一個想法,您可能根本不需要嵌套循環。 對於每個i
,您只需減去當前窗口中最后一個字符串的長度,然后添加一個新字符串。 見圖片:
因此,考慮到這一點,我建議您編寫以下版本的代碼:
function longestConsec(strarr, k) {
// Cannot create any joined string with k greater than length
if(strarr.length < k) {
return "";
}
else if(k <= 0) {
return "";
}
else if(strarr.length == k) {
return strarr.join("");
}
let longestIndex = -1;
let longestLength = 0;
// length of our current group of strings
let currentLength = 0;
const maxLen = strarr.length;
for(let i=0; i<maxLen; ++i) {
// Forget the first strings length
if(i >= k) {
currentLength -= strarr[i-k].length;
}
// add the current strings length
currentLength += strarr[i].length;
// check if this is the largest length and save it's index
// Only possible after processing at least k strings
// Eg when i==1, we already went through 2 strings at this point
if(i >= k-1) {
if(currentLength > longestLength) {
const startIndex = i-k+1;
longestLength = currentLength;
longestIndex = startIndex;
}
}
}
return strarr.slice(longestIndex, (longestIndex + k)).join("");
}
這是一個jsFiddle測試: https ://jsfiddle.net/32g5oqd1/2/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.