2016-05-28 67 views
1

我很難找出如何計算元音,輔音和聲明元音分別出現在用戶輸入中的頻率。 用戶將任何文本例如:「惡作劇完畢!」而結果必然是: 一:2 E:2 我:2 ○:0 U:0 非元音:11JavaScript計數元音,輔音和顯示發生

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); 

但它不工作。我已經在其他許多論壇上搜索過,但是,我沒有發現任何類似的內容。

+0

對於初學者學習使用瀏覽器的開發工具來檢查錯誤,並進行調試設置斷點。 'userData.legth'將是未定義的,因爲它應該是'userData.length'。爲任何匹配添加到每個元音計數器的邏輯也沒有意義。你從來沒有檢查特定的元音匹配 – charlietfl

回答

2

首先,讓我們指出一些事情

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

長度缺少字母「N」和你不需要數小於或等於,因爲你已經從指數0開始。所以你只需要小於

另外:

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

什麼,你在這裏做的是,每一次一個元音匹配,則增加變量的所有的人,所以這個詞將打印每元音有一個計數。所以看看這一個:

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); 

我遵循你的邏輯,以保持它簡單和更好的可讀性。我們按照相同的方式匹配正則表達式,但我們現在也檢查確切的字符,因此我們可以遞增正確的變量。

對於否則如果,以儘量減少一點正則表達式,我們只是檢查是否匹配小寫字母之一,因爲我們轉換用戶數據降低的情況下,只要我們得到它:

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

試試我的例子,看看它是否適合您的需求。

+0

謝謝@Konstantinos Vytiniotis,這正是我一直在尋找的! – Giovane

+0

當您評估所有變量時,您如何期望返回數據? –

+0

@AlexKudryashev我回答了沒有函數的問題,所以顯然沒有回報。我創建了一個與發佈的代碼相關的工作示例,以便他可以理解這個概念以及他所做的錯誤,因爲他似乎缺少一些基礎知識。一旦掌握了基本知識,他就可以嘗試並創建一個功能。所以我的代碼不是一個函數,但它可以是一個函數的一部分。 –

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);

0

那麼,你需要檢查你遇到哪些元音,然後更新 適當的變量。我們很少需要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容易 身邊讓你的頭。

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('');

+0

而非元音的總數? – 1983

+0

添加'var nonVowelArr = ['b','c','d'];'爲內部添加行'if(nonVowelArr.indexOf(inpArr [i]> -1)result ['nonVowel'] =(結果['nonVowel'] || 0)+1;'。 –

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

+0

你需要一個'new alpha()'某處,你可能只需要使用一個對象文字 – 1983

+0

new()在plunker ex .. i沒有使用obj點亮,所以不必擔心在多種用法下重置對象 – d1820

+0

是的,但是這裏編寫的代碼不起作用。 – 1983

1

清楚地看到更好的編碼着想和性能我會這樣做,

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));

0

這是另一種方式來做到這一點,但分裂的文本,通過每個字母循環和計數元音的總體思路是相似的其他人發佈一下爲好。

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'));