JavaScript:查找字符串中最长的单词

14
function longestWord(string) {
    var str = string.split(" ");
    var longest = 0;
    var word = null;
    for (var i = 0; i < str.length - 1; i++) {
        if (longest < str[i].length) {
            longest = str[i].length;
            word = str[i];
        }
    }
    return word;
}
当我调用longestWord("傲慢与偏见")时,它返回的是'傲慢'而不是最长单词'偏见'...为什么? 我查看了一些类似的问题,但解决方案看起来很像我的代码。

8
不要将字符串数组命名为"str"。 - aaronman
33个回答

17

这是因为您没有比较数组中的所有项,您遗漏了最后一项。

for (var i = 0; i < str.length - 1; i++)

应该是这样的

for (var i = 0; i < str.length; i++)
或者
for (var i = 0; i <= str.length - 1; i++)

谢谢!第二个解决方案就是我想要做的,但我错过了等号。 - bard
3
根据我的经验,我个人会建议其他人使用第一种解决方案以提高可读性。第二种方案需要更长的编写时间,并且如果没有编译器优化(每次重新计算str.length-1),效率会较低,但现实中的代码不会使用第二种解决方案。 - coder543
@coder543,它必须在每次迭代中重新计算,因为.length可能是一个会改变的访问器。虽然这是一项快速操作。 - zzzzBov
从数学上讲,这两者是等价的。i < x与i <= x - 1相同,因此编译器可以进行优化,如果它有一个针对此的优化过程。 - coder543

14
采用函数式方法解决这类问题的一个优点是,你甚至不需要计数。
请查看 MDN Array.reduce 以获取更多信息。(注意:IE8需要为 reduce 添加 shim)

function longer(champ, contender) {
  return (contender.length > champ.length) ? contender : champ;
}

function longestWord(str) {
  var words = str.split(' ');
  return words.reduce(longer);
}

console.log(longestWord("The quick brown fox jumped over the lazy dogs"));


5

这里有一个使用forEach的解决方案,它可以帮助您避免未来的错误。

function longestWord(string) {
    var str = string.split(" ");
    var longest = 0;
    var word = null;
    str.forEach(function(str) {
        if (longest < str.length) {
            longest = str.length;
            word = str;
        }
    });
    return word;
}
console.log(longestWord("pride and prejudice"));

您最初的问题只是str.length - 1应该改成str.length,如果原来不更改,您将无法访问数组的最后一个元素。


4
您的条件中有一个-1,它甚至没有扫描它:
for (var i = 0; i < str.length - 1; i++) {

Should be:

for (var i = 0; i < str.length; i++) {

Demo: http://jsfiddle.net/LfgFk/


3
索引将会增加到 str.length -1
for (var i = 0; i < str.length - 1; i++) {

因此,最后一个单词没有被处理。

尝试使用:longestWord("骄傲和偏见Pride AAAAAAAAAAAAAAAAAAAAAAAAA")。您会看到它是有效的(返回AAAAAAAAAAAAAAAAAAAAAAAAA)。

如果您不确定,最简单的解决方法是从for循环中删除-1

for (var i = 0; i < str.length; i++) {

请查看包括问题和修复版本的演示:链接在此


2

在Firefox中,ForEach更快,但在Chrome中速度较慢, 但是使用缓存的长度和函数apply/call的for循环在FF和Chrome中都更快。

希望下面的代码可以帮助:

function getLongest (arrStr) {
  var longest = 0, word;

  for(var i=0 , len = arrStr.length ; i < len ; i++){

    if(longest < arrStr[i].length) {
       longest = arrStr[i].length;
       word = arrStr[i];
    }

  }

  return word;
}

function isLongest (str) {
  var arrayStr = str.split(' ');
  return function(fn) {
    return fn.apply(this,[arrayStr]);
  }
}

isLongest("hello aaaaaaaaaaaaaaaaaaaaaaaaa bbb")(getLongest); //aaaaaaaaaaaaaaaaaaaaaaaaa

2
您可以使用像Lo-Dash这样的库简化您的代码:
function longestWord(string) {
    var words = string.split(' ');
    return _.max(words, function(word) { return word.length; });
}

1
我会推荐给你这篇this关于定义三种方法的精彩文章:

1 - 使用FOR循环查找最长的单词

    function findLongestWord(str) {
  var strSplit = str.split(' ');
  var longestWord = 0;
  for(var i = 0; i < strSplit.length; i++){
    if(strSplit[i].length > longestWord){
    longestWord = strSplit[i].length;
     }
  }
  return longestWord;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

2 - 使用sort()方法查找最长的单词

function findLongestWord(str) {
  var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
  return longestWord[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

3 - 使用reduce()方法找到最长的单词

function findLongestWord(str) {
  var longestWord = str.split(' ').reduce(function(longest, currentWord) {
    return currentWord.length > longest.length ? currentWord : longest;
  }, "");
  return longestWord.length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

当然,如果你想获取字符串,只需在返回部分去掉长度即可。

1
function longestWord(sentence){
 var arr = sentence.match(/[a-z]+/gi);
 arr.sort(function(a, b){
 return b.length - a.length;
});
 return arr[0];
}
longestWord('hello man@#$%');
// ==> output: hello

1
我发现这里的.map方法很有帮助(如果你想要单词的字符计数,而不是单词本身):
 function findLongestWord(str) {   
   var array = str.split(/\s+/);
   var wordLength = array.map(function(i) {
     return i.length;                       
   });   
   var largest = Math.max.apply(Math, wordLength);   
   return largest; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接