3 回答

TA贡献1852条经验 获得超1个赞
只要字符不是空格(/\S/- 大写 S),您就需要添加项目。如果是空格,则需要将长度与前一个 进行比较longestWord.length,并将单词分配给longestWord。在空间的情况下,你 init arr。
注意:赋值longestNum = longestNum; longestWord = longestWord;是多余的,它们已经等于自己了。此外, thelongestNum也是多余的,因为它是从longestWord( longestWord.length)派生而来的。
function findLongestWordLength(str) {
let arr = [];
let longestWord = "";
for (let i = 0; i < str.length; i++) {
if (/\S/.test(str[i])) { // as long as it's not a space
arr.push(str[i]);
} else {
if (arr.length > longestWord.length) {
longestWord = arr.join("");
}
arr = [];
}
}
return longestWord.length;
}
var result = findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(result);

TA贡献1993条经验 获得超6个赞
我假设/./i.test(str[i])您正在尝试匹配除空格之外的所有内容。.匹配除换行符以外的所有内容,因此我将其切换为[^\s]实际匹配除空格以外的所有内容。我还将控制台日志放在循环之外,因此输出有些可读。
function findLongestWordLength(str) {
let arr = [];
let longestWord = "";
let longestNum = 0;
for (let i = 0; i <= str.length - 1; i++) {
if (/[^\s]/i.test(str[i])) {
arr.push(str[i]);
} else if (/[\s]/i.test(str[i])) {
if (arr.length > longestNum) {
longestNum = arr.length;
longestWord = arr.join("");
arr = [];
} else {
longestNum = longestNum;
longestWord = longestWord;
arr = [];
}
}
}
console.log(arr); // last word since you reset arr every step
console.log(longestWord);
console.log(longestNum);
return longestNum;
}
findLongestWordLength("The quick brown fox jumped over the lazy dog");
一个更好的方法是:
function findLongestWordLength(sentence) {
const words = sentence.split(' ');
return words.reduce((max, currentWord) => max > currentWord.length ? max : currentWord.length, 0);
}

TA贡献1786条经验 获得超13个赞
只需进行最少的修改,您就需要进行这些更改:
确保最后一个字的长度也得到验证。目前不是。为此,您可以在执行循环之前向输入字符串添加一个空格。
更改 test
/./i
,因为它将匹配除换行符以外的任何内容。您需要检查字母,可能还有数字,可能还有下划线,但不是标点符号。所以/\w/
会有所改善。你可以想到更好的正则表达式。浏览器正在慢慢支持/\p{L}/u
,它可以匹配任何字母表中的字母。else
应该删除 中的测试,因为您只想无条件地处理这里的任何其他情况。例如,逗号也将分隔单词,在下一个单词开始之前,它后面可能没有空格。不要从数组长度中减去一个:它确实具有单词的字符(仅),因此您需要全长。
这些是使其正确的最小更改:
function findLongestWordLength(str) {
let arr = [];
let longestWord = "";
let longestNum = 0;
str += " "; // trick to ensure that the last word is also inspected
for (let i = 0; i <= str.length - 1; i++) {
if (/\w/i.test(str[i])) { // match alphanumerical character, not anything.
// The `i` suffix doesn't harm, but is useless here
arr.push(str[i]);
} else { // Remove any condition here.
if (arr.length >= longestNum) { // you need the full length, not minus 1
longestNum = arr.length; // (idem)
longestWord = arr.join("");
arr = [];
} else {
longestNum = longestNum; // not needed
longestWord = longestWord; // not needed
arr = [];
}
}
//console.log(arr);
//console.log(longestWord);
//console.log(longestNum);
}
return longestNum;
}
console.log(
findLongestWordLength("The quick brown fox jumped over the lazy dog")
)
如您所知,有更短的方法可以做到这一点,例如使用这个函数式编程解决方案:
function findLongestWordLength(str) {
return Math.max(...str.match(/\w+|$/g).map(s => s.length));
}
console.log(findLongestWordLength("The quick brown fox jumped over the lazy dog"));
添加回答
举报