Javascript - 如何获取字符串,打印单词,字符,空格,平均单词长度的#并作为对象返回
Javascript - How to take a string, print the # of words, characters, spaces, avg word length and return as an object?
我想给函数传递一个字符串并打印数字单词、字符、空格和平均长度每个单词作为对象属性。我正在寻找回报
{"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
};
- 找出句子中最长的单词——Javascript
- undercore返回数组中对象的indes,其中单词存在于对象中的句子中
- 我想使用replace函数扫描json对象,然后用字符串替换匹配的单词
- 我的无引用 JavaScript 对象存在在哪里以及存在多长时间
- Javascript如何在一个6个字母长的单词中混合字母,并将每个字母放在一个特定的按钮上
- JS/Jquery:字符串到单词的文本分割脚本使用字典和最长匹配
- 查找数组中最长的单词/字符串
- WebStorm 格式化长 JavaScript 对象属性值
- Android Chrome:音频对象需要很长时间才能开始流式传输mp3
- Javascript - 如何获取字符串,打印单词,字符,空格,平均单词长度的#并作为对象返回
- 如何在正则表达式对象中使用单词边界
- 计算长字符串中每个句子的单词,jQuery
- 通过JavaScript中的dictionary对象检查单词的有效性-是否有更好的方法来引用/构建词典
- 使用Javascript从字典对象中返回随机单词
- 使用单词'英语'因为变量/对象名称在javascript中不起作用
- 如何将长JS代码作为对象拆分为单独的文件
- fabricjs:长按时抖动画布上的对象
- 删除包含特定单词的对象/字段
- jquery if检查长对象
- 根据第一个单词对对象数组进行排序