Javascript 为什么我的元音计数函数没有返回正确的解决方案?
出于某种原因,如果有一对相邻的元音,则元音计数()只计算一个元音。例如,它将“goes”中的“oe”算作一个元音。我不明白为什么会这样。无论我使用forEach函数还是for循环,它都会这样做。有人能澄清我的误解吗 这是我的密码:Javascript 为什么我的元音计数函数没有返回正确的解决方案?,javascript,foreach,Javascript,Foreach,出于某种原因,如果有一对相邻的元音,则元音计数()只计算一个元音。例如,它将“goes”中的“oe”算作一个元音。我不明白为什么会这样。无论我使用forEach函数还是for循环,它都会这样做。有人能澄清我的误解吗 这是我的密码: 函数元音计数(str){ var charArr=str.split(“”); 变量模式=/[aeiou]/gi; var-vouelcount=0; /* charArr.forEach(函数(char){ if(模式测试(字符)){ //console.log(
函数元音计数(str){
var charArr=str.split(“”);
变量模式=/[aeiou]/gi;
var-vouelcount=0;
/*
charArr.forEach(函数(char){
if(模式测试(字符)){
//console.log(char);
元音计数++;
}
});
*/
对于(变量i=0;i 日志(元音计数(“goes”)
我不知道为什么,但是全局搜索/g
导致它在e
上失败。您不需要全局搜索,因为您正在检查单个字符
以下是一个工作版本:
function VowelCount(str) {
var pattern = /[aeiou]/i;
var vowelCount = 0;
for (var i = 0; i < str.length; i++) {
if (pattern.test(str[i])){
vowelCount++;
}
}
return vowelCount;
}
console.log(VowelCount("goes")); //2
函数元音计数(str){
变量模式=/[aeiou]/i;
var-vouelcount=0;
对于(变量i=0;i
我还更改了它,这样就不需要将其转换为字符数组。在弦上进行预切可以达到相同的目的 您可以使用模式和
match()
函数获得元音的数量。这样,您就不需要在数组中循环,只要它匹配,就可以得到您的计数:
var chars = 'fred is a flintstone';
var pattern = /[aeiou/gi;
var matches = chars.match(pattern);
var vowelCount = matches ? matches.length : 0;
根据“与
exec()
(或与之结合使用),test()
在同一个全局正则表达式实例上多次调用将超过上一个匹配。”因此,删除g
可以解决问题,就像通过执行if(/[aeiou]在循环的每次迭代中创建新的regex对象一样/gi.test(charArr[i])…
P.S.return(str.match(/[aeiou]/gi)| |[])。length
将为您提供元音计数,而无需任何循环。您删除“g”标志是正确的。使用g时,正则表达式将维护一个名为lastIndex的属性,该属性会变得高级,并且在出现错误结果之前不会重置。@jeffcarey这一点很有用-我对正则表达式所做的很少,如果我是OP,这肯定会让我绊倒。或者正如我在上面所评论的,您可以在一行中完成:return(str.match(/[aeiou]/gi)| |[]).length
…嗯,是的,这有点圆滑,尽管我倾向于尝试把事情解释得更清楚一点,以便OP公司展示步骤(是的,我确实使用了三元结构,没有解释)。在我发布之前没有看到你的评论。
function VowelCount(subject) {
console.log(subject.match(/[aeiou]/gi));
// or to get the length
console.log(subject.match(/[aeiou]/gi).length);
}
VowelCount("goes");
//result -> ["o", "e"]