开发者问题收集

无法读取 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