Javascript: 计算字符串中元音字母的数量

6
我正在尝试计算字符串中元音字母的数量,但我的计数器似乎只返回一个。请问有人能告诉我代码有什么问题吗?谢谢!
var vowelCount = function(str){
  var count = 0;
  for(var i = 0; i < str.length; i++){
    if(str[i] == 'a' || str[i] == 'i' || str[i] == 'o' ||str[i] == 'e' ||str[i] == 'u'){
      count+=1;
    }
  }
  return count;
}
console.log(vowelCount('aide'));

9
return count;移到for循环外。 - Jaydip Jadhav
3
尝试使用 string.match(/[aeiou]/g).length 来匹配字符串中元音字母的数量。 - Rajesh
3
@Rajesh 我会使用/[aeiou]/ig - Phil
1
@ColinSygiel 正则表达式非常强大,如果您需要处理字符串,则是不可或缺的。从这里开始~ http://www.regular-expressions.info/ - Phil
3
可能是使用JavaScript计算字符串中元音字母的数量的重复问题。 - Rajesh
显示剩余2条评论
2个回答

7
在`for`循环外部使用`return count`,或者将正则表达式`/[^aeiou]/ig`作为`.replace()`的第一个参数,并使用空字符串`""`作为替换字符串,获取`.replace()`返回的字符串的长度。

vowelLength = "aide".replace(/[^aeiou]/ig, "").length;

console.log(vowelLength);

vowelLength = "gggg".replace(/[^aeiou]/ig, "").length;

console.log(vowelLength);

正则表达式描述
字符集 [^xyz] 一个否定或补充字符集。也就是说,它匹配任何不在括号中的内容。
标记 i 忽略大小写 g 全局匹配;找到所有匹配项而不是在第一个匹配项后停止
使用扩展元素、Array.prototype.reduce()String.prototype.indexOf()String.prototype.contains()(如果支持)

const v = "aeiouAEIOU";

var vowelLength = [..."aide"].reduce((n, c) => v.indexOf(c) > -1 ? ++n : n, 0);

console.log(vowelLength);

var vowelLength = [..."gggg"].reduce((n, c) => v.indexOf(c) > -1 ? ++n : n, 0);

console.log(vowelLength);


或者,你可以使用for..of循环、RegExp.prototype.testRegExp /[aeiou]/i来增加一个最初设置为0的变量,如果传递的字符.test()返回true

var [re, vowelLength] = [/[aeiou]/i, 0]; 

for (let c of "aide") re.test(c) && ++vowelLength;

console.log(vowelLength); 

vowelLength = 0;

for (let c of "gggg") re.test(c) && ++vowelLength;

console.log(vowelLength); 


1
使用正则表达式是更好的方法。 - 31piy
1
@DarshakGajjar 是的,i 标志用于匹配不区分大小写。 - guest271314
1
@DarshakGajjar "g 全局匹配; 查找所有匹配项而不是在第一个匹配后停止" RegExp - guest271314
1
小心... 这段代码可能会抛出错误。当没有匹配项时,String#match 返回 null 而不是空数组。请参阅 MDN 上的这篇文章 - gyre
1
我并没有质疑你的答案的有效性,只是提供了一种替代方案! :) 两种方法仍然不如简单的for循环高效,因为你的方法创建了一个不必要的字符串对象,而我的方法则创建了一个不必要的数组。 - gyre
显示剩余3条评论

1
你还需要这样做。使用 toLowerCase() 也要。
 var vowelCount = function(str){
  var count = 0;
  for(var i = 0; i < str.length; i++){
    if(str[i].toLowerCase() == 'a' || str[i].toLowerCase() == 'i' || str[i].toLowerCase() == 'o' ||str[i].toLowerCase() == 'e' ||str[i].toLowerCase() == 'u'){
      count+=1;
    }
  }
 return count;
}
vowelCount('aide')

2
首先,请不要回答这些基础问题。它们对门户网站的贡献不大。其次,如果您选择回答,请添加解释。您是为读者而回答,而不仅仅是为了 OP。 - Rajesh
1
我会创建一个字符串的小写版本,而不是为每个字符重复5次这个操作。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接