返回句子中最长单词的长度

20

我已经编写了一个函数,它接收一个句子并计算该句子中最长的单词。

function findLongestWord(str) {

  var charArray = str.split(" ");
  var wordArray = [];


  for(var i = 0; i < charArray.length; i++ ) {
    wordArray.push(charArray[i].length);
    wordArray.sort();
    wordArray.reverse();

  }

  return wordArray[0];
}

我的函数可以处理如下输入:

findLongestWord("The quick brown fox jumped over the lazy dog");

但是当我传递它时:

findLongestWord("What if we try a super-long word such as otorhinolaryngology")

该函数返回:

4
与其说...
19

9
.sort()并不像你期望的那样起作用。试着提供一个回调函数来正确排序你的数字。 - Gavin
4
实际上你根本不需要使用 wordArray。在每一步中,只需将当前长度与 maxLen (最初设置为0)进行比较并相应地更新即可。 - georg
2
你不需要使用O(n log n)的排序操作来查找符合条件的单个元素。 - Yury Tarabanko
1
尝试使用wordArray.sort(function(a, b) { return b.length - a.length; });,这将按降序排序。 - Gavin
4
这段代码可以简化为一行:return str.split(' ').reduce((prev, curr) => curr.length > prev ? curr.length : prev, 0); - Gavin
显示剩余5条评论
11个回答

26
您的排序函数按字典序对数组进行排序,因此最终得到:
[1,10,19,2,2,2,3,4,4,4]

反过来,你得到

[4,4,4,3,2,2,2,19,10,1]

其中 4 是第一个数

你完全不需要排序,只需使用 Math.max

function findLongestWord(str) {
    return Math.max.apply( null, str.split(" ").map( (x) => x.length) );
}

25

简要概述

您的数字被视为字符串进行排序。

如果想让它们按照数字大小降序排列,在函数中应该改为以下代码:

wordArray.sort(function(a, b) { return b - a; });

解释

根据文档

sort()方法会就地排序数组, 并返回排序后的数组。这个排序不一定是稳定的默认排序顺序按照字符串Unicode码点排序。

[...]

语法

arr.sort()

arr.sort(compareFunction)

参数

compareFunction 可选

用来指定排序顺序的比较函数。如果省略,元素按照每个字符的Unicode代码点值进行排序,根据每个元素的字符串转换方式排序。

强调部分为本人添加,因此得到以下内容:

var str = "What if we try a super-long word such as otorhinolaryngology";
var charArray = str.split(" ");
// now charArray == ["What", "if", "we", "try", "a", "super-long", "word", "such", "as", "otorhinolaryngology"]
// when you take the length of each word and end up with
var wordArray = [4, 2, 2, 3, 1, 10, 4, 4, 2, 19];
// and if you use plain wordArray.sort() without specific sort function you get
wordArray = [1, 10, 19, 2, 2, 2, 3, 4, 4, 4];
// and once reversed it is
wordArray = [4, 4, 4, 3, 2, 2, 2, 19, 10, 1];
// this is why you end up with wordArray[0] == 4

你也可以将整个函数实现为一行代码:

function findLongestWord(str) {
  return str.split(/\s+/).sort(function(a, b) { return b.length - a.length; })[0].length;
}

console.log("Longest word length = ", findLongestWord("The default sort order is according to string Unicode code points"));

console.log("Longest word length = ", findLongestWord("What if we try a super-long word such as otorhinolaryngology"));


15

虽然和你的代码有一点不同,但这个应该会得到相同的结果!

function longestWord(string) {
    var str = string.split(" ");
    var longest = 0;
    for (var i = 0; i < str.length; i++) {
        if (longest < str[i].length) {
            longest = str[i].length;
        }
    }
    return longest;
}

console.log(longestWord("The quick brown fox jumped over the lazy dog"));
console.log(longestWord("What if we try a super-long word such as otorhinolaryngology"));


4
谢谢您修复了问题!这是正确的做法——不需要建立愚蠢的“长度数组”。 - georg

6
你可以获取单词长度的数组,然后使用 Math.max.apply 函数。

function findLongestWord(str){
  return Math.max.apply(null, str.split(" ").map(x=>x.length));
}

var l = findLongestWord("What if we try a super-long word such as otorhinolaryngology")

console.log(l)


4

function findLongestWord(str) {
  return str.split(' ').reduce((m, w) => Math.max(m, w.length), 0);
}

var result = findLongestWord('The quick brown fox jumped over the lazy dog');
console.log(result);


2
reduce is more natural here arr.reduce((m, w) => Math.max(m, w.length), 0) - georg

4

我认为更好的方法是使用 mapmax 来解决这个问题:

function findLongestWord(str) {
    return Math.max.apply(null, str.split(" ").map(function(word){
        return word.length;
    }));
}

3

最短的方法:

console.log(
  'What if we try a super-long word such as otorhinolaryngology'
  .split(' ')
  .sort(function(a, b) {
    return b.length - a.length
  })[0].length
);

或者作为一个函数:

function returnLongest(str) {
  return str
    .split(' ')
    .sort(function(a, b) {
      return b.length - a.length
    })[0].length;
}
console.log(returnLongest('What if we try a super-long word such as otorhinolaryngology'))


1
OP想要返回最长单词的长度,而不是排好序的单词数组。 - Gavin
@Gavin 哎呀,你说得对。我会纠正的。 - Emil S. Jørgensen

2

您不必使用数组。如果您只想保存最长的单词,只需将最长大小与当前单词大小进行比较即可。

function findLongestWord(str) {
  var charArray = str.split(" ");
  var longestWord = 0;

  for (var i = 0; i < charArray.length; i++) {
    let l = charArray[i].length;
    if (l > longestWord)
      longestWord = l;
  }
  return longestWord;
}

console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
console.log(findLongestWord("What if we try a super-long word such as otorhinolaryngology"));


1
sort函数会按字典顺序对数组进行排序,这不是你想要的。如果你想要完美的升序数字排序,你需要传递排序方法。此外,在for循环中进行排序和反转数组,这意味着每次添加一个项目都会进行排序和反转。
相反,你应该这样做:
for(var i = 0; i < charArray.length; i++ ) {
    wordArray.push(charArray[i].length);
  }

wordArray.sort(ascendingSort);
wordArray.reverse();

function ascendingSort(a, b) {
    return a - b;
}

return wordArray[0];

看起来是这样。我错误地认为按字典顺序排序就足够了,因为那些是数字,而不仅仅是字符串。我会编辑我的答案以避免混淆。 - Catalin Iancu

0

不要推长度和排序,请尝试以下方法

 function findLongestWord(str) {

  var charArray = str.split(" ");
  var longestWordLength = 0;
  var longestWord = "";

  for(var i = 0; i < charArray.length; i++ ) {
    if(charArray[i].length > longestWordLength){
      longestWordLength = charArray[i].length;
      longestWord = charArray[i]
    }
  }
  return {longestWord , longestWordLength};
}

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