Как уже указывалось, вы итерируете один раз слишком многоВаша последняя итерация будет пытаться получить доступ к индексу, который не существует в вашем массиве.
Кроме этого, ваш код, похоже, не работает так, как вы описали.Он не обращается к «самой длинной» в любой точке, а просто захватывает первые две строки, которые длиннее первой.
Если вы хотите найти последовательные строки, которые объединяются для самой длинной длины, подумайте о чем-нибудькак это вместо этого:
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()
не обязательно, но в любом случае я считаю, что результат немного большев соответствии с вашей задачей.