【问题标题】:Javascript Last Letter getting cut offJavascript Last Letter 被截断
【发布时间】:2014-08-06 19:11:28
【问题描述】:

好的,所以基本上这段代码将一个句子传递给函数,函数需要找出哪个单词最长返回。一切都很好,除了最后一个字母不断被切断。那么什么是解决这个问题的好方法呢?

    function LongestWord(sen) { 
sen = sen.toLowerCase();
  var build = "";
  var arr = [];
  var longest = 0;
for(var i = 0; i < sen.length;i++){
  var cur = sen.charCodeAt(i);
  console.log(sen.charCodeAt(i))
  if(i == sen.length - 1){

       arr.push(build);
    }
    if(sen.charAt(i) === " "){
    arr.push(build);
     build = "";
    }
    if(cur >= 97 && cur <= 122){
    build += String.fromCharCode(cur);
    }
  }
  console.log(arr);
  for(var e = 0; e < arr.length - 1;e++){
    if(arr[e].length > arr[e + 1].length){

   longest = arr[e];
    }
    else{
    longest = arr[e + 1];
    }
  }
  return longest; 

}

// keep this function call here 
// to see how to enter arguments in JavaScript scroll down
console.log(LongestWord("Johnny ErsoL"));  

它返回“Johnny”,这是正确的,但这是数组最后的样子。

[ 'johnny', 'erso' ]

【问题讨论】:

  • 这是什么?你只是想返回一个按字符数排序的句子中所有单词的数组吗?
  • 原因是你没有读到足够的字符。您应该阅读长度 +1。

标签: javascript


【解决方案1】:

这是我的建议?

function LongestWord(sen) {
    return sen.split(/\b/).filter(function(item) {
        return item.trim().length;
    }).sort(function(a,b) {
        return b.length - a.length;
    });
}

在单词边界分割句子,然后剪掉空格,最后按每个单词的长度排序,返回排序后的数组。

【讨论】:

  • 我会将其标记为答案(我确定它是正确的),但我几天前仍在学习 JavaScript,我不确定该代码是如何工作的(还没有!) .我不想做c+p代码,那样我学不会!
  • 如果你把它分开,并阅读splitArray.filterArray.sort 的文档,它真的很简单,比你的代码要简单得多。
  • 谢谢,我会做一些研究!
  • @adeneo 你知道我为什么会被否决吗?我正在试图弄清楚,但看不到任何合理的理由,除了我的解决方案可能将标点符号视为单词,但您的也是......
  • @plalx - 我不知道为什么它被否决了,答案对我来说看起来不错,我没有真正测试它,但我仔细阅读了它,看起来还不错。它不会过滤掉所有东西,我的也不会,它也不会返回一个数组,但我不明白为什么它会那么重要。
【解决方案2】:

尝试替换

for(var i = 0; i < sen.length;i++){
  var cur = sen.charCodeAt(i);
  console.log(sen.charCodeAt(i))
  if(i == sen.length - 1){

       arr.push(build);
    }
    if(sen.charAt(i) === " "){
    arr.push(build);
     build = "";
    }
    if(cur >= 97 && cur <= 122){
    build += String.fromCharCode(cur);
    }
  }

arr=sen.split();

【讨论】:

  • 哇,这是一个如此简单的修复,让我觉得完全忘记了 split 方法很愚蠢。不过谢谢,我会尽快将其标记为答案。
  • 一个问题是字符串不能包含除 a - z 或数字之外的任何字符。所以我使用 sen.split(" ") 将每个单词放入数组中,那么我将如何继续检查它们是否有坏字符?
  • @user3890432 我找到了this question,它提供了sen.replace(/\W/g, ''); 作为从字符串中去除所有非字母数字字符(_ 除外)的简单方法。
  • 我只是尝试添加它,它根本没有改变代码@Larkeith
  • @user3890432 抱歉,我忘了提到 String.replace() 只返回一个新字符串,它不会改变原始字符串 - 去除你必须使用 sen=sen.replace(/\W/g, ''); 的字符,并检查是否有任何你会使用if (sen==sen.replace(/\W/g, '')) {Do stuff};
【解决方案3】:

您有一个带有e &lt;arr.length -1 的for 循环。我认为你不需要 -1。

【讨论】:

    【解决方案4】:

    我知道您已经找到了答案,但我只是想向您展示您正在做的事情的替代方法。

    为了简化您的代码并使其更易于理解且更灵活,通常最好确保每个函数只执行一件事或具有单一职责。

    在您的代码中,您的LongestWord 函数负责识别什么是单词找出哪个单词最长。

    你可以做的是创建一个知道如何将句子标记为单词的函数:

    function forEachWordsIn(str, callback) {
        var rx = /\b(\w+?)\b/g,
            match;
    
        while (match = rx.exec(str)) callback(match[0]);
    }
    

    然后使用longestWord函数中的那个词迭代器函数,这使得这个算法现在变得非常简单:

    function longestWord(sen) {
        var longestWord = '';
    
        forEachWordsIn(sen, function (word) {
            if (word.length > longestWord.length) longestWord = word;
        });
    
        return longestWord;
    }
    

    注意:我将LongestWord 重命名为longestWord,因为使函数以大写字母开头是识别构造函数的众所周知的标准。

    【讨论】:

    • 哦,我明白了,在函数之间拆分任务。我忘记提到的另一件事是单词中不能有任何坏字符(坏字符=!,@,#,$,%,^,&,*等)基本上它只能有字母它在比较字符串并返回最长的字符串之前。关于如何做到这一点的任何想法?示例: (arr[i].charCodeAt(e)
    • @user3890432,是的,您只需在迭代器正则表达式中将\S 更改为\w。这将确保仅将单词字符捕获为单词。我更新了我的答案。您还可以看到责任分离如何帮助实现这一微小变化,因为我们不必触及 longestWord 逻辑。
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多