2015-04-21 61 views
3

和以前一樣,我已經查找了所有的答案,我只是一個初學者,我試圖從中學習而不是隻是交出答案。Javascript:用元音填充對象的功能作爲鍵和數值作爲值

var voweler = function (str) { 
 
    var strArr = str.split('') 
 
    var obj = {}; 
 
    for (var i = 0; i < strArr.length; i++) { 
 
    if (strArr[i] == 'a') { 
 
     obj.a = 0; 
 
     obj.a++; 
 
    } else if (strArr[i] == 'e') { 
 
     obj.e = 0; 
 
     obj.e++; 
 
    } else if (strArr[i] == 'i') { 
 
     obj.i = 0; 
 
     obj.i++; 
 
    } else if (strArr[i] == 'o') { 
 
     obj.o = 0; 
 
     obj.o++; 
 
    } else if (strArr[i] == 'u') { 
 
     obj.u = 0; 
 
     obj.u++; 
 
    } 
 
    }; 
 
    return obj; 
 
} 
 
voweler("This is a test") 
 
//returns this which is wrong. Object {i: 1, a: 1, e: 1}

+1

又有什麼問題? – adeneo

+0

爲什麼它不計算我的第二個字母? –

+0

http://jsfiddle.net/adeneo/1L9dpj0o/ – adeneo

回答

2

您的更新計數的代碼是錯誤的。遇到的每個元音,你運行obj.<vowel> = 0,重置計數!要解決這個問題,請在之前設置之前您輸入for循環,然後在for循環中只增加計數器。

如果你喜歡,如果元音存在於只有一個入口,可以有條件地增加:

if(strArr[i] == <some_vowel>){ 
    if(obj.<some_vowel> === undefined)obj.<some_vowel> = 1; 
    else obj.<some_vowel> ++; 
} 
+0

我想盡量避免有o:0。 –

+0

爲什麼會這樣? – Sinkingpoint

+0

理想情況下,我寧願不返回空白,就像我在其他地方使用這種類型的代碼一樣,我不想返回零負載。 –

0

你可能喜歡的東西是這樣的:

function voweler(input) { 
    var result = { 
     a: 0, e: 0, i: 0, o: 0, u: 0 
    }; 

    for (var i = 0; i < input.length; i++) { 
     var char = input.charAt(i).toLowerCase(); 

     if (result.hasOwnProperty(char)) { 
      result[char] ++; 
     } 
    } 

    return result; 
} 
2

夫婦的提示:

  • 在循環前,循環會將鍵的屬性值賦給0,每次該字符是元音時。
  • 如果您想查找大寫和小寫元音,可以使用toLowerCase()。
  • 您可以使用indexOf。如果它在字符串中找不到參數,它將返回-1。

var voweler = function (str) { 
 
    var strArr = str.toLowerCase().split(''); 
 
    var obj = {}; 
 
    strArr.forEach(function(ch) { 
 
    if ('aeiou'.indexOf(ch) !== -1) { 
 
     obj[ch] = (obj[ch] || 0) + 1; 
 
    } 
 
    }); 
 
    return obj; 
 
} 
 
console.log(voweler("This is a test")); 
 
// Object {i: 2, a: 1, e: 1}

+0

好的一點是沒有機會進行類型轉換。 – DTing

0

只是因爲我們可以...和DTing有答案了。

function countVowels(s) { 
    var vowels = /[aeiou]/, 
      o = {}; 

    s.toLowerCase().split('').forEach(function(c){ 
    if (vowels.test(c)) o.hasOwnProperty(c)? ++o[c] : o[c] = 1; 
    }); 
    return o; 
} 

console.log(JSON.stringify(countVowels('hi there'))); 

還有:

function countVowels(s) { 
    return (s.toLowerCase().match(/[aeiou]/g) || []).reduce(function(o, c) { 
    o[c] = (o[c] || 0) + 1; 
    return o; 
    }, {}); 
} 
相關問題