Javascript - 如何获取一个字符串,打印单词、字符、空格的#、平均字长和 return 作为对象?

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

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

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

你可以试试这个

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.

的变量中

每次我们点击按钮,我们都会生成一个新对象,其中将包含字符串数据。我们可以使用点符号 (.) 或括号符号 ([])

来设置它的属性

没有比这更简单的了:

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

您似乎在以下行中有错字:

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

所以唯一阻止您的函数按预期工作的是 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 个单词也很重要,因为当用空格分开时,几个零- length 字符串将被添加到 wordArray。如果你想删除数组中的这些零长度条目,你可以看到 this SO answer.

有关更有效的求平均值的方法(完全从函数中删除 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.");

变量 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."));