Javascript 最后一个字母被剪掉了

Javascript 最后一个字母被剪掉了,javascript,Javascript,好的,基本上这段代码将一个句子传递到函数中,函数需要找出返回的单词最长。除了最后一个字母不断被剪掉外,一切都很顺利。那么,解决这个问题的好办法是什么呢 function LongestWord(sen) { sen = sen.toLowerCase(); var build = ""; var arr = []; var longest = 0; for(var i = 0; i < sen.length;i++){ var cur = sen.charCode

好的,基本上这段代码将一个句子传递到函数中,函数需要找出返回的单词最长。除了最后一个字母不断被剪掉外,一切都很顺利。那么,解决这个问题的好办法是什么呢

    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"));  

你有一个带有
e的for循环你有一个带有
e的for循环这是我的建议

function LongestWord(sen) {
    return sen.split(/\b/).filter(function(item) {
        return item.trim().length;
    }).sort(function(a,b) {
        return b.length - a.length;
    });
}
在单词边界上拆分句子,然后删除空格,最后按每个单词的长度排序并返回排序后的数组。

我的建议是什么

function LongestWord(sen) {
    return sen.split(/\b/).filter(function(item) {
        return item.trim().length;
    }).sort(function(a,b) {
        return b.length - a.length;
    });
}
在单词边界上拆分句子,然后删除空格,最后按每个单词的长度排序并返回排序后的数组。

尝试替换

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);
    }
  }
试着替换

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);
    }
  }

我知道你已经找到了你的答案,但是我只是想给你展示一个你正在做的事情的替代方案

为了简化您的代码并使其更易于理解和灵活,通常最好确保每个函数只做一件事,或者只负责一项工作

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

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

function forEachWordsIn(str, callback) {
    var rx = /\b(\w+?)\b/g,
        match;

    while (match = rx.exec(str)) callback(match[0]);
}
然后使用
longestWord
函数中的words迭代器函数,这使得该算法现在非常简单:

function longestWord(sen) {
    var longestWord = '';

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

    return longestWord;
}

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

我知道您已经找到了答案,但我只是想向您展示一种替代方法

为了简化您的代码并使其更易于理解和灵活,通常最好确保每个函数只做一件事,或者只负责一项工作

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

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

function forEachWordsIn(str, callback) {
    var rx = /\b(\w+?)\b/g,
        match;

    while (match = rx.exec(str)) callback(match[0]);
}
然后使用
longestWord
函数中的words迭代器函数,这使得该算法现在非常简单:

function longestWord(sen) {
    var longestWord = '';

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

    return longestWord;
}


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

这是什么?您只是想返回一个按字符数排序的句子中所有单词的数组吗?原因是您没有读取足够的字符。你应该读长度+1。这是什么?您只是想返回一个按字符数排序的句子中所有单词的数组吗?原因是您没有读取足够的字符。你应该读长度+1。哇,这是一个如此简单的修正,让我觉得完全忘记了拆分方法很愚蠢。不过谢谢,我会尽快将其标记为答案。一个问题是字符串不能包含除a-z或数字以外的任何字符。因此,我使用sen.split(“”)将每个单词放入数组中,然后如何继续检查它们是否有坏字符?@user3890432我找到了,它给出了
sen.replace(/\W/g')
是一种从字符串中去除所有非字母数字字符(除了_)的简单方法。我只是尝试添加它,但它根本没有改变代码@Larkeith@user3890432抱歉,我忘了提到
String.replace()
只返回一个新字符串,它不会改变原始字符-要去除字符,您必须使用
sen=sen.replace(/\W/g'),并检查如果(sen==sen.replace(/\W/g',){Do stuff},是否有任何您将使用的
哇,这是一个如此简单的修复,让我觉得完全忘记了拆分方法很愚蠢。不过谢谢,我会尽快将其标记为答案。一个问题是字符串不能包含除a-z或数字以外的任何字符。因此,我使用sen.split(“”)将每个单词放入数组中,然后如何继续检查它们是否有坏字符?@user3890432我找到了,它给出了
sen.replace(/\W/g')
是一种从字符串中去除所有非字母数字字符(除了_)的简单方法。我只是尝试添加它,但它根本没有改变代码@Larkeith@user3890432抱歉,我忘了提到
String.replace()
只返回一个新字符串,它不会改变原始字符-要去除字符,您必须使用
sen=sen.replace(/\W/g'),并检查如果(sen==sen.replace(/\W/g',){Do stuff},是否有任何您将使用的
我会将其标记为答案(我确信它是正确的),但几天前我还在学习JavaScript,我还不确定代码是如何工作的(现在!)。我不想成为c+p代码,那样我就不会学习了!如果您将其拆分,并阅读
split
Array.filter
Array.sort
的文档,它确实非常简单,比您的代码简单得多。谢谢,我将对它们进行一些研究@你知道我为什么会被否决吗?我正在试图弄明白,除了可能我的解决方案将标点符号视为单词外,我看不出任何合理的理由,但你的解决方案也一样…@plalx-我不知道为什么它被否决,答案在我看来很好,我没有真正测试它,但我仔细阅读了它,它看起来很好。它不会过滤掉所有内容,我的也不会,它也不会返回数组,但我不明白为什么这会如此重要。我会将其标记为答案(我相信它是正确的),但几天前我还在学习JavaScript,我不确定代码是如何工作的(现在!)。我不想成为c+p代码,那样我就不会学习了