【问题标题】:Finding Longest & Shortest word in JavaScript在 JavaScript 中查找最长和最短的单词
【发布时间】:2019-04-30 00:39:36
【问题描述】:

其中一个问题是在一个字符串中找到最长的单词,另一个是在一个字符串中找到最短的单词。

我试图找出解决它们之间的区别。除了为什么最长长度是“longestlength = 0”而不是“longestlength = newString[0].length”之外,我什么都理解。我尝试用它来解决它,并且输出未定义。同样,对于“shortestLength”,如果我用“0”而不是“newString[0].length”初始化它,我会得到未定义,但我不明白它背后的原因。

//code for longest string

 function longestWord(string) { 
let newString =string.split(" ");
let longestWord;
let longestlength= 0;
for(let i=0; i<newString.length; i++){
if(newString[i].length > longestlength){
  longestlength = newString[i].length;
  longestWord= newString[i];
 }
  }
 return longestWord;
  }

 //code for shortest string
  function shortestWord(string) {
 var stringArray = string.split(" ");  
  var shortestWord;
  var shortestLength = stringArray[0].length; 
  for(var i = 0; i < stringArray.length; i++){
   if(stringArray[i].length < shortestLength){
  shortestLength = stringArray[i].length;   
  shortestWord = stringArray[i];            
  }
    }
return shortestWord;
  }

【问题讨论】:

  • longestWord函数中,用0初始化longestlength变量是有意义的,因为它将被长度大于0的数组的第一个元素替换。在shortestWord你假设第一个单词是最短的,仅在随后的 for 循环迭代中验证。但是,我认为那里有一个错误,即shortestWord应该用stringArray[0]的值初始化。
  • 我很好奇您的输入文本是否有任何标点符号。如果是这样,那么在" " 上拆分不一定会给你一个准确的分词。

标签: javascript arrays


【解决方案1】:

使用reduce 可以在一行中解决您的问题。

最长的单词:

string.split(' ').reduce((acc, cur) => acc.length >= cur.length ? acc : cur);

最短的单词:

string.split(' ').reduce((acc, cur) => acc.length <= cur.length ? acc : cur);

这就是您的代码可能不起作用的原因:在shortestWord 中,您将当前最短长度设置为数组中第一个单词的长度,但您没有将最短单词设置为数组中的第一个单词,它仍然是未定义的。如果数组中的第一个单词恰好是最短的单词,则没有哪个单词更短,因此不会将任何单词分配给shortestWord,并且该函数将返回undefined

解决方案:替换

var shortestWord;

var shortestWord = stringArray[0];

【讨论】:

  • 这是解决查找字符串的最小值/最大值问题的好方法,但对 OP 解决代码无法正常工作的(诚然很差的)问题没有帮助。从长远来看,对于大多数试图学习的人来说,花式一个班轮不会有好处。
  • @SvenWritesCode 你是对的。我添加了一个解释。
  • 太棒了。如果您想添加另一个问题的答案:“为什么最长的长度是“longestlength = 0”而不是“longestlength = newString[0].length。”如果拆分字符串的第一个元素是最长的单词@ 987654329@ 永远不会计算为真,并将返回 longestWord 未定义。
【解决方案2】:

longestlength 始终必须匹配 longestWord。如果您设置了长度,而不是单词本身,并且长度实际上是最长的,则返回 longestWord 尽管它还为空。

为避免此类错误,只需保留单词本身,并使用.length检查其长度:

  function longest(words) {
    let longest;
    for(const word of words.split(" "))
      if(!longest || word.length > longest.length) // swap this to get the "shortest"
        longest = word;
    return longest;
 }

【讨论】:

    【解决方案3】:
    function longest(str){
        return str.split(" ").reduce((a,b)=> b.length >= a.length ? b : a,'')
    }
    
    function shortest(str){
        return str.split(" ").reduce((a, b)=>a.length <= b.length ? a : b, '')
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多