'Length'属性在迭代Array时未定义

时间:2015-10-07 19:36:32

标签: javascript

迭代数组以找到最长的字符串。每次我收到错误Cannot read property length of undefinedConsole.log告诉我,正在读取和理解数组的长度以及字符串的长度,因此我无法理解存在未定义属性的位置。事实上,我只是将程序的原始长度增加了三倍,试图确保每个变量都被定义但仍然没有好处。任何帮助将不胜感激。

function findLongestWord(str) {
  var longest = 0;
  var array = str.split(" ");
  var arrayL = array.length;
  for (i=0; i<=arrayL; i++) {
    var currentWord = array[i];
    var currentL = currentWord.length;
    if (currentL > longest) {
      currentL = longest;
    };
  };
  return longest;
};

findLongestWord("The quick brown fox jumped over the lazy dog");

编辑:虽然下面的答案确实解决了这个问题,但我也想提及那些可能稍后谷歌这个帖子的人,我还必须将我的最终if statementcurrentL = longest;换成{{ 1}}因为longest = currentL是我最终归来的。

3 个答案:

答案 0 :(得分:3)

问题是迭代的界限

for (i=0; i<=arrayL; i++) {

请注意,您将要查找执行此操作的array [array.length]并且始终未定义,因为10个项目的数组中的第10个项目是[9],[10]未定义。

另外,请使用var here

for (var i=0; i < arrayL; i++) {

答案 1 :(得分:2)

为什么不利用JS为你提供的功能而不是容易出错的手写循环,为什么不利用JS提供的功能 - 在这种情况下Array.prototype.map

function findLongestWord(s) {
    return Math.max.apply(this, s.split(/\s+/).map(function(w) {
        return w.length;
    }));
}

Math.max.apply(this, some_array)是使用给定数组调用Math.max(a, b, c, d, ...)的标准JS方式,而不是传递未知长度的参数列表。

在ES2015中你可以使用更短的:

function findLongestWord(s) {
    return Math.max(...s.split(/\s+/).map((w) => w.length));
}

答案 2 :(得分:2)

您错误读取错误:-) not length is undefined ,但是您尝试获取此属性的对象 - undefined。
所以 currentWord undefined
因为你有错误的循环条件:i<=arrayL
i == arrayL - var currentWord = array[i] 未定义时,您会收到错误。

修复它:i < arrayL