无法读取 Javascript 中未定义错误消息的属性“长度”
2019-06-01
9447
我正在尝试解决 code wars 上的代码挑战,不明白为什么在尝试运行它时会收到有关数组内字符串
.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”
,因为它是第一个字符串之后的 2 个最长的字符串,这是要求。
VM304:7 Uncaught TypeError: Cannot read property 'length' of undefined
3个回答
数组中的元素从 0 到
length - 1
。
数组中有 6 个字符串,最后一个字符串的索引为 5。
由于条件设置了您应该在索引小于或
等于
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);
David
2019-06-01
您正在使用错误的边界对数组进行迭代。
您应该将其更改为 strarr.length - 1。
或者删除小于或等于,仅使用小于运算符
因为数组中最后一个可访问元素的索引是数组长度减 1
Rami Jarrar
2019-06-01
正如所指出的,您迭代了太多次。您的最后一次迭代将尝试访问数组中不存在的索引。
除此之外,您的代码似乎没有按照您描述的方式执行。它没有在任何时候解决“最长”问题,而只是抓取比第一个字符串更长的前两个字符串。
如果您想找到组合长度最长的连续字符串,请考虑类似这样的方法:
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()
并不是完全必要的,但无论如何,我相信结果更符合您的任务。
Tyler Roper
2019-06-01