迭代数组以找到最长的字符串。每次我收到错误Cannot read property length of undefined
。 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 statement
从currentL = longest;
换成{{ 1}}因为longest = currentL
是我最终归来的。
答案 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