开发者问题收集

迭代数组时“Length”属性未定义

2015-10-07
115

迭代数组以查找最长的字符串。每次我都收到错误 无法读取未定义的属性长度Console.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语句currentL = longest; 换成 longest = currentL ,因为 longest 是我最终返回的。

3个回答

问题在于迭代的界限

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

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

另外,请在此处使用 var

for (var i=0; i < arrayL; i++) {
Travis J
2015-10-07

您读错了错误 :-) 不是长度 未定义 ,而是您尝试获取此属性的对象未定义。
因此 currentWord 未定义
因为您的循环条件错误: i<=arrayL
i == arrayL 时 - var currentWord = array[i] 未定义 ,您会得到错误。

只需修复它: i < arrayL

Grundy
2015-10-07

与其使用容易出错的手写循环来迭代数组,为什么不利用 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));
}
Alnitak
2015-10-07