Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的元音计数函数没有返回正确的解决方案?_Javascript_Foreach - Fatal编程技术网

Javascript 为什么我的元音计数函数没有返回正确的解决方案?

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(

出于某种原因,如果有一对相邻的元音,则元音计数()只计算一个元音。例如,它将“goes”中的“oe”算作一个元音。我不明白为什么会这样。无论我使用forEach函数还是for循环,它都会这样做。有人能澄清我的误解吗

这是我的密码:

函数元音计数(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"]