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