Javascript - 如何获取字符串,打印单词,字符,空格,平均单词长度的#并作为对象返回

Javascript - How to take a string, print the # of words, characters, spaces, avg word length and return as an object?

本文关键字:单词长 对象 返回 空格 字符 何获取 获取 单词 打印 字符串 Javascript      更新时间:2023-09-26

我想给函数传递一个字符串并打印数字单词、字符、空格和平均长度每个单词作为对象属性。我正在寻找回报

{"numWords": 7, "numCharacters": 30, "numSpaces": 6, "avgWordLength": 3.x}

我也是新手,所以我会对任何看起来不对劲或可以更好的事情提出任何建议。谢谢!

function allTheCounts(str) {
  var numWords = str.split(" ").length; 
  var numCharacters = str.length; 
  var numSpaces = numWords - 1;
  var strArray = str.split(" ");
  var avgWordLength = 0;    
    for (var i = 0; i < numWords.length; i++){
    avgWordLength += strArray[i].length;
    }
  var avgWordLength = avgWordLength/numWords;
  var answerObject = {
    numWords: numWords,
    numCharacters: numCharacters,
    numSpaces: numSpaces,
    avgWordLength: avgWordLength
  };
 return answerObject;
}
 allTheCounts("Hello world. It is a good day.");

所以唯一阻止你的函数按预期工作的是 numWords.length ,它应该更改为简单的 numWords ,因为它已经是你想要迭代的数组的长度。更改此设置后,代码将按预期工作。

不过,您似乎还想要一些有关功能样式和设计的提示,所以我继续调整了一些东西。

function allTheCounts(str) {
  var wordArray = str.split(" ");//get array of words
  var wordLengths = 0;//initalize wordLengths to 0
  for (var i = 0; i < wordArray.length; i++) {
    wordLengths += wordArray[i].length;
  }
  return {
    numWords: wordArray.length,
    numCharacters: str.length,
    numSpaces: wordArray.length - 1,
    avgWordLength: wordLengths/wordArray.length//Use Math.round(10*wordLengths/wordArray.length)/10 to round to one decimal place
  };
}
allTheCounts("Hello world. It is a good day.");

删除不必要的中间变量

你会注意到你的函数变得有点长,并且局部变量多于结果。我们可以通过尝试找到我们重复努力的地方来纠正这一点。显然,我们不需要对同一个字符串进行多次split(' '),所以我们只需将拆分数组存储在一个变量中,并在我们想使用字符串中的单词数时引用该数组的长度。同样的逻辑应用几次,以删除几行不必要的代码。这使得函数更易于阅读,甚至有可能提高效率。

重要提示!制表符或其他空格字符不会显示为单词之间的空格。仅用换行符分隔的两个单词将计为一个单词,依此类推。同样重要的是要考虑到allTheCounts("Hello world. It is a good day.");将导致检测到 22 个单词,因为当按空格拆分内容时,会将几个零长度字符串添加到 wordArray 中。如果您想删除数组中的这些零长度条目,您可以看到这个 SO 答案。

有关一种更有效的平均值方法(从函数中完全删除 for 循环),请参阅下面的 Max 解决方案。将他聪明的数学融入这个函数中,得到这个几乎是一行

function allTheCounts(str) {
  var wordArray = str.split(" ");//get array of words
  return {
    numWords: wordArray.length,
    numCharacters: str.length,
    numSpaces: wordArray.length - 1,
    avgWordLength: (str.length - (wordArray.length - 1))/wordArray.length
  };
}
allTheCounts("Hello world. It is a good day.");

没有比这更简单的了:

function allTheCounts(str) {
  var spaces = (str.match(/ /g) || []).length;
  var numWords = str.split(' ').length;
  return {
    numWords: numWords,
    numCharacters: str.length,
    numSpaces: spaces,
    avgWordLength: (str.length-spaces)/numWords
  };
}
document.getElementById('answer').innerHTML = JSON.stringify(allTheCounts("Hello world. It is a good day."));
<div id='answer'></div>

我刚刚重构了你的代码,它很简单。

function allTheCounts(str) {
  var words = str.split(" ");  
  var answerObject = {
    numWords: words.length,
    numCharacters: str.length,
    numSpaces: words.length - 1,
    avgWordLength: parseInt(str.length / words.length)
  };
  console.log(answerObject);
  
   return answerObject;
}
 allTheCounts("Hello world. It is a good day.");

JSBIN的工作示例

变量numWords声明为数字,但有时在代码中用作数组(如在for循环中)。

function allTheCounts(str) {
  var numWords = str.split(" ");
  var numCharacters = str.length;
  var numSpaces = numWords.length - 1;
  var strArray = str.split(" ");
  var avgWordLength = 0;
  for (var i = 0; i < numWords.length; i++) {
    avgWordLength += strArray[i].length;
  }
  var avgWordLength = avgWordLength / numWords.length;
  var answerObject = {
    numWords: numWords.length,
    numCharacters: numCharacters,
    numSpaces: numSpaces,
    avgWordLength: avgWordLength
  };
  return answerObject;
}
console.log(allTheCounts("Hello world. It is a good day."));

你可以试试这个

var data = document.getElementById("object-data");
var button = document.getElementById("my-button");
button.addEventListener("click", function() {
  
    var userInput = prompt("Enter a string");
    var words = userInput.split(/'s+/);
    
    var wordLengths = words.map(function(word) {
        return word.length;
    });
  
    var totalWordLength = wordLengths.reduce(function(word1, word2) {
        return word1 + word2;
    });
  
    var userData = {};
    userData.words = words.length;
    userData.characters = userInput.length;
    userData.spaces = userInput.match(/'s/g).length;
    userData.avgWordLength = totalWordLength / userData.words;
  
    data.innerHTML = "<p>Words: " + userData.words + 
                     "<br>Characters: " + userData.characters + 
                     "<br>Spaces: " + userData.spaces + 
                     "<br>Average Word Length: " + userData.avgWordLength + "</p>"
    
});
<button id="my-button">Get String Data</button>
<p id="object-data"></p>

我们将从引用两个变量开始。第一个是保存我们正在寻找的数据的段落。第二个是按钮,它将用于事件侦听器。

单击按钮时,我们将需要获取用户输入。我们使用 JavaScript 的提示方法来做到这一点。这将读取用户键入的内容并将其存储在名为 userInput 的变量中。

每次单击按钮时,都会生成一个新对象,其中包含字符串数据。我们可以用点表示法(.)或括号表示法([])来设置它的属性

看起来您在以下行中有拼写错误:

for (var i = 0; i < numWords.length; i++){
// change to this
for (var i = 0; i < strArray.length; i++){

计算长度时,您可能希望从单词中删除句点。

avgWordLength += strArray[i].length;
// change to this    
avgWordLength += strArray[i].replace(/'.$/, '').length;

仍然有一些极端情况没有处理,例如连续空格。希望这能给你一个好的开始。

使代码更简洁的一个小改进:

var numWords = str.split(" ").length; 
// move this further down and change to this to eliminate some duplication
var numWords = strArray.length;

另一个 - 删除不必要的临时变量:

var answerObject = {
    numWords: numWords,
    numCharacters: numCharacters,
    numSpaces: numSpaces,
    avgWordLength: avgWordLength
};
return answerObject;
// change to this
return {
    numWords: numWords,
    numCharacters: numCharacters,
    numSpaces: numSpaces,
    avgWordLength: avgWordLength
};