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."));
我想向函数传递一个字符串并打印出 单词、字符、空格和平均长度 每个单词作为对象属性。我正在寻找 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."));