我正在尝试编写一个接收字符串并计算元音数量的javascript函数。显示每个元音的计数以及总计。如果每个元音都在字符串中,它就可以正常工作,但是如果例如没有 A 或 E,它将返回 null。
有没有办法拦截它并用 0 替换 null?还是有更有效的方法来实现这一目标?感谢任何可以提供帮助的人!
function countVowels(inString) {
return outString = (
"Total vowels: " + inString.match(/[aeiou]/gi).length +
"nTotal A's: " + inString.match(/[a]/gi).length +
"nTotal E's: " + inString.match(/[e]/gi).length +
"nTotal I's: " + inString.match(/[i]/gi).length +
"nTotal O's: " + inString.match(/[o]/gi).length +
"nTotal U's: " + inString.match(/[u]/gi).length
);
}
<form>
Enter a string to count its vowels. <br>
<input type="text" id="inString"><br>
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button>
</form>
您可以使用|| []
作为默认的"返回值",以防.match
返回null
:
function countVowels(inString) {
return outString = (
"Total vowels: " + (inString.match(/[aeiou]/gi) || []).length +
"nTotal A's: " + (inString.match(/a/gi) || []).length +
"nTotal E's: " + (inString.match(/e/gi) || []).length +
"nTotal I's: " + (inString.match(/i/gi) || []).length +
"nTotal O's: " + (inString.match(/o/gi) || []).length +
"nTotal U's: " + (inString.match(/u/gi) || []).length
);
}
<form>
Enter a string to count its vowels. <br>
<input type="text" id="inString"><br>
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button>
</form>
另外,请注意,我从所有单字符匹配中删除了[]
。在正则表达式中,[a]
和 a
是等效的。
如果运算符的左侧为"真实",则||
将返回该侧。
如果左侧是"falsy",则||
将始终返回语句的右侧,这是我们的默认值。
如果.match
找到任何结果,它将返回一个数组,该数组为"真实"。
如果.match
没有找到任何结果,则返回 null
,这是 "falsy"。
问题不在于正则表达式,而在于逻辑。
对于给定的inString
say测试,它没有元音a
或o
。因此,正则表达式将找不到任何匹配项,这将失败。
你可以尝试这样的事情:
原始代码:
function countVowels(inString) {
return outString = (
"Total vowels: " + (inString.match(/[aeiou]/gi) || []).length +
"nTotal A's: " + (inString.match(/[a]/gi) || []).length +
"nTotal E's: " + (inString.match(/[e]/gi) || []).length +
"nTotal I's: " + (inString.match(/[i]/gi) || []).length +
"nTotal O's: " + (inString.match(/[o]/gi) || []).length +
"nTotal U's: " + (inString.match(/[u]/gi) || []).length
);
}
<form>
Enter a string to count its vowels. <br>
<input type="text" id="inString"><br>
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button>
</form>
更新的代码
function countVowels(inString) {
var vowels = "aeiou";
var ret = "Total vowels: " + getMatchLength(inString, vowels);
for(var i = 0; i< vowels.length; i++)
ret += "nTotal " + vowels[i].toUpperCase() + "'s: " + getMatchLength(inString, vowels[i])
return ret;
}
function getMatchLength(str, chars) {
return (str.match(new RegExp("["+ chars + "]")) || []).length;
}
<form>
Enter a string to count its vowels. <br>
<input type="text" id="inString"><br>
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button>
</form>
当match
的结果为 null
时,您可以添加使用条件运算符来输出 0 而不是 length
。
为了使其更具可读性,您可以事先获取长度,然后在最终字符串中使用它。
function countVowels(inString) {
var aCount = inString.match(/[a]/gi) !== null ? inString.match(/[a]/gi).length : 0;
var eCount = inString.match(/[e]/gi) !== null ? inString.match(/[a]/gi).length : 0;
var iCount = inString.match(/[i]/gi) !== null ? inString.match(/[a]/gi).length : 0;
var oCount = inString.match(/[o]/gi) !== null ? inString.match(/[a]/gi).length : 0;
var uCount = inString.match(/[u]/gi) !== null ? inString.match(/[a]/gi).length : 0;
var vowelsCount = aCount + eCount + iCount + oCount + uCount;
var outString = "Total vowels: " + vowelsCount +
"nTotal A's: " + aCount +
"nTotal E's: " + eCount +
"nTotal I's: " + iCount +
"nTotal O's: " + oCount +
"nTotal U's: " + uCount;
return outString;
}
<form>
Enter a string to count its vowels. <br>
<input type="text" id="inString"><br>
<button type="button" onclick="console.log(countVowels(inString.value))">Count vowels</button>
</form>