javascript计数元音,辅音和显示出现

时间:2016-05-28 21:34:29

标签: javascript

我无法弄清楚如何计算元音,辅音并从用户输入中声明元音单独出现的频率。 用户输入任何文本ex:“Mischief managed!”,结果必须是: a2 e:2 我:2 o:0 你:0 非元音:11

var userData = prompt ("Enter any text here");
var a = 0;
var e = 0;
var i = 0;
var o = 0;
var u = 0;
var consonants = 0;
var count;

for (count = 0; count <= userData.legth; count++){
   if((userData.charAt(count).match(/[aeiou]/))){       
     a++;
     e++;
     i++;
     o++;
     u++;
    }else if((userData.charAt(count).match(/[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]/))){

    consonants++;
}
}
 console.log ("a: " + a);
 console.log ("e: " + e);
 console.log ("i: " + i);
 console.log ("o: " + o);
 console.log ("u: " + u);
 console.log ("consonants: " + consonants);

但它不起作用。我已经在很多其他论坛上搜索过,但是我找不到这样的东西。

8 个答案:

答案 0 :(得分:2)

首先,让我们指出一些事情

for (count = 0; count <= userData.legth; count++){

长度缺少字母'n'并且您不需要计数小于或等于因为您已经从索引0开始。所以您只需要< em>小于。

此外:

if((userData.charAt(count).match(/[aeiou]/))){       
    a++;
    e++;
    i++;
    o++;
    u++;
} else if((userData.charAt(count).match(/[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]/))){
    consonants++;
}

你在这里做的是,每次它与元音匹配时,你为所有这些增加变量,所以对于单词 hi ,它会打印每一个元音有一个数。所以看看这个:

var userData = prompt("Enter any text here").toLowerCase();
var a = 0;
var e = 0;
var i = 0;
var o = 0;
var u = 0;
var consonants = 0;
var count;

for (count = 0; count < userData.length; count++){
    var char = userData.charAt(count);
    if(char.match(/[aeiou]/)){
        switch (char) {
            case 'a':
                a++;
                break;
            case 'e':
                e++;
                break;
            case 'i':
                i++;
                break;
            case 'o':
                o++;
                break;
            case 'u':
                u++;
                break;
        }
    } else if(char.match(/[bcdfghjklmnpqrstvwxyz]/)) {
        consonants++;
    }
}

console.log ("a: " + a);
console.log ("e: " + e);
console.log ("i: " + i);
console.log ("o: " + o);
console.log ("u: " + u);
console.log ("consonants: " + consonants);

我遵循你的逻辑,保持简单,更好的可读性。我们以与您相同的方式匹配正则表达式,但我们也检查现在的确切字符是什么,因此我们可以增加正确的变量。

对于 else if ,为了最小化正则表达式,我们只检查它是否与小写字母之一匹配,因为我们将userData转换为小写,一旦我们得到它:

var userData = prompt("Enter any text here").toLowerCase();

试试我的例子,看看它是否符合您的需求。

答案 1 :(得分:1)

嗯,你需要检查你遇到的元音然后更新 适当的变量。

但很少需要for。 JavaScript提供更高级别的数组 迭代函数除其他外,将防止这样的错误 作为一个一个错误,就像你的代码中一样: - )

虽然您的输入是字符串,而不是数组,但您可以将其转换 通过使用到一个 String.prototype.split

var input = 'Mischief managed!';

var result = input.split('').reduce(function(result, c){
    c = c.toLowerCase();
    if(c in result){
        result[c] += 1;
    }else{
        result.other += 1;
    }
    return result;
}, {a:0, e:0, i:0, o:0, u:0, other:0});

console.log(JSON.stringify(result));

我在这里使用Array.prototype.reduce,但你可以, 最初,找到Array.prototype.forEach更容易 好好理解。

答案 2 :(得分:1)

为了更好的编码和性能,我会这样做;

&#13;
&#13;
var str = "the quick brown fOx jUmps OvEr the lazy dog";

function getVowelCount(s) {
  var lut = {
      a: "0",
      e: "0",
      i: "0",
      o: "0",
      u: "0"
    },
    a = s.split("").map(c => c.toLowerCase());
  return a.reduce((p, c) => (p[c] && 1 * p[c]++, p), lut);
}
console.log(getVowelCount(str));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您可以使用

var userData = prompt("Enter any text here"),
    count = userData.split('').reduce(function (r, a) {
        var vowels = ['a', 'e', 'i', 'o', 'u'],
        p = vowels.indexOf(a.toLowerCase());
    if (~p) {
        r[vowels[p]] = (r[vowels[p]] || 0) + 1;
    } else {
        r['non-vowels']= (r['non-vowels']|| 0) + 1;
    }
    return r;
}, Object.create(null));

console.log(count);

答案 4 :(得分:0)

首先计算所有字母,然后过滤所需的字母。

function cntLetters(inp){
  var result={};
  var vowels = 'aeiouy'.split('');
  var inpArr=inp.split('');
  for(var i=0,n=inpArr.length;i<n;i++){
    result[inpArr[i]] = (result[inpArr[i]]||0)+1;
    if(vowels.indexOf(inpArr[i]) > -1)
       result['vowels'] = (result['vowels'] || 0) + 1;
  }
  return result;
}
var cnt = cntLetters('see your later');
console.log(cnt['a']);
console.log(cnt['e']);

如果您不想使用不区分大小写var inpArr=inp.toLowerCase().split('');

答案 5 :(得分:0)

我会做这样的事情

var alpha = function(){      
  this.a = 0;
  this.e = 0;
  this.i = 0;
  this.o = 0;
  this.u = 0;
  this.other = 0;    
}

function counter(word, alpha) {
  for (i = 0; i < word.length; i++) {
    var chr = word.charAt(i).toLowerCase();
    if (alpha.hasOwnProperty(chr)) {
      alpha[chr]++;
    } else {
      alpha.other++;
    }
  }
}

function checkWord()
{
  var a = new alpha();
  counter("test", a); 
  console.log(a);         
}

Plunker

中可以看到行动

答案 6 :(得分:0)

这是另一种方法,但是分割文本,循环每个字母和计算元音的一般想法与其他人发布的内容类似。

&#13;
&#13;
getCount = (str) => {
  var vowelsCount = 0;
  str = str.split('');
    for(var i = 0; i<str.length; i++) {
      if(str[i] === "a" || str[i] === "e" || str[i] === "i" || str[i] === "o" || str[i] === "u"){
        vowelsCount++;
    }
  }
  return vowelsCount;
}

console.log(getCount('onomatopoeia'));
&#13;
&#13;
&#13;

答案 7 :(得分:0)

我们可以使用正则表达式来匹配字符串中的元音。

正则表达式,用于匹配字符串中所有元音的出现: / [aeiouAEIOU] +?/ g

下面是工作代码段:

    //function that takes string as input
    //function returns an object containing vowel count without case in account.
    function vowelCount(input) {
        //to get vowel count using string.match
        var arrVowels =input.match(/[aeiouAEIOU]+?/g);

        //acc=accumulator, curr=current value
        var countVowCons= arrVowels.reduce(function (acc, curr) {
           if (typeof acc[curr.toLowerCase()] == 'undefined') {
               acc[curr.toLowerCase()] = 1;
           } 
           else {
               acc[curr.toLowerCase()] += 1;
           }
           return acc;
           // the blank object below is default value of the acc (accumulator)
           }, {}); 

        countVowCons.NonVowels= input.match(/[^aeiouAEIOU]+?/g).length;
        return countVowCons;        
      }