迭代数组时“Length”属性未定义
迭代数组以查找最长的字符串。每次我都收到错误
无法读取未定义的属性长度
。
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
是我最终返回的。
问题在于迭代的界限
for (i=0; i<=arrayL; i++) {
请注意,执行此操作时您将查找 array[array.length],并且它将始终未定义,因为 10 个项目的数组中的第 10 个项目是 [9],[10] 未定义。
另外,请在此处使用 var
for (var i=0; i < arrayL; i++) {
您读错了错误 :-) 不是长度
未定义
,而是您尝试获取此属性的对象未定义。
因此
currentWord
未定义
因为您的循环条件错误:
i<=arrayL
,
当
i == arrayL
时 -
var currentWord = array[i]
未定义
,您会得到错误。
只需修复它:
i < arrayL
与其使用容易出错的手写循环来迭代数组,为什么不利用 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));
}