【问题标题】:'Length' Property Undefined while iterating Array迭代数组时未定义“长度”属性
【发布时间】:2015-10-08 05:26:04
【问题描述】:

迭代一个数组以找到最长的字符串。每次我收到错误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; 交换为 longest = currentL,因为 @987654327 @ 是我最终返回的内容。

【问题讨论】:

  • 你读错了 :-) 不是 length 是 _undefined,而是你尝试获取此属性的对象 - 未定义
  • 数组是零索引的,但长度不是。换句话说,i&lt;arrayL
  • 另外,您是要返回最长的单词,还是要返回您创建的数组中最长单词的索引?哦,您不需要在 foriffunction 末尾添加分号。
  • @j08691 我试图返回最长单词的长度。感谢您的分号帮助,我还是个初学者。

标签: javascript


【解决方案1】:

问题在于迭代的界限

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

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

另外,请在此处使用 var

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

【讨论】:

  • 天哪,我原以为这会是一个快速的评论,然后投票以错别字结束。
  • @torazaburo - 那么,元讨论呢?很有趣,因为你并没有真正参与那里,但还好。让我们深入了解您的误解,以免您主动驱使用户离开该网站。 “我可以告诉你的一件事是,如果你开始针对那些只是想提供帮助的专家投反对票,你就会开始把这些人赶走。我已经在一些案例中看到了这种情况。” -Brad Larson♦ (meta.stackoverflow.com/a/255861/1026459)。不鼓励战术性的否决,并呼吁滥用。您应该重新评估您使用网站的方式。
  • 我尊重你的元专业知识。如果您还没有看到它,这里可能是相关的:meta.stackoverflow.com/questions/255459/…。如您所见,意见不同。
  • @torazaburo - 不是。那里的情绪也是对内容进行投票,而不是惩罚性或战术性地使用您的投票。此外,发布的唯一警告是“按你的意愿投票”,这在一定程度上是正确的。所以你可以像这样投票,但这样做是对社区的伤害。感谢您积极努力破坏其他所有人。
  • 如果我可以这么说的话,对关于元的讨论进行了相当片面的评价。当然,拒绝意见不同的想法是不正确的。例如,一个不同问题的答案比我上面提到的问题的接受答案多,它说“只要我们继续用答案奖励不好的问题,问题的质量就会继续下降。”见meta.stackoverflow.com/questions/252506/…
【解决方案2】:

您读错了 :-) 长度不是 未定义,而是您尝试获取此属性的对象 - 未定义。
所以 currentWordundefined
因为你有错误的循环条件:i&lt;=arrayL,
i == arrayL - var currentWord = array[i]未定义并且你得到错误。

只需修复它:i &lt; arrayL

【讨论】:

  • 试图说服您停止回答这样一个被误导和天真的用户提出的问题是一种战术性的否决。希望这可以解释反对意见。至于整体行为,嗯,作为一个社区,我们仍然在积极处理元数据的前景和野外这样的地方。这些类型的反对票被认为是对系统的滥用。请不要让他们阻止您回答。
  • @TravisJ,感谢您的解释 :-) 我真的不认为这是错字,建议 torazaburo
【解决方案3】:

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

【讨论】:

  • 虽然这给了你最长的单词,但它并没有回答 OP 的问题。
  • 请注意,对于旧版本的 IE,Array.prototype.map() 可能需要进行 polyfill。
  • @TrueWill 它是 long 我们应该警告旧浏览器需要 polyfill 以获得对 ES5 的支持的时间。实际上,大约一年前,我在 meta-SO 上提出了这个问题。
  • 如果你要去 ES2015,那Math.max(...[for (x of s.split(/\s+/)) x.length]) 会不会干净一点?
  • @Jasen 不过,这种边界条件错误正是.map 等可以轻松解决的问题
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2021-02-13
  • 2019-07-13
  • 2012-10-29
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多