2012-06-27 215 views
-2

我正在嘗試創建一小段javascript來計算一段文本中每個字母的數量,供個人使用。我有一個以前的版本,每個字母都有一個單獨的循環,並且它有效,但是創建起來相當漫長而乏味。所以我試圖做一個更短的,我不明白爲什麼它不工作。謝謝!Javascript嵌套循環問題?

var text = prompt("Enter Text",""); 
// Remove Spaces 

var text = text.toUpperCase(); 
// Get the Text Length 

var textL = text.length; 
// Create the Hashtable 

var hashtable = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 
// Define the Latin Alphabet 

var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
// Nested loop to find frequencies and input them into the hashtable 

for (d=0; d<=25; d++) { 
    for (i=0; i<=textL; i++){ 
     if (text.charAt(i) === alphabet.charAt(d)){ 
      hashtable[d] = hashtable[d] + 1; 
     } 
    } 
} 
+10

要轉換的字符串爲大寫,那麼相對於一個小寫字母。 – Quantastical

+1

請用你的循環替換'= new Array(0,0,...'''''''''並且簡單地把'hashtable [d] = 0;''') –

+0

我一定會替換新的陣列(0,0 ...與那個,但我可以問爲什麼? 我不知道我是如此愚蠢,以至於比較這兩個。非常感謝! – ThisIsForge

回答

0

如果你願意支持的ECMAScript 5,有可能使用新的mapreduce擁有的代碼更小一點。

給出一個字符串,你可以split它,把它變成一個數組。您需要事先刪除任何空格.replace(/\s/g, ''),然後reduce將迭代每個字母並返回結果。結果可以保存在一個對象中,每個屬性名稱都是字母。

var str = "SampleText".toLowerCase().replace(/\s/g,''); 
var counts = str.split('').reduce(function(acc, x) { 
    acc[x] = (acc[x] || 0) + 1; 
    return acc; 
}, {}); 

輸出:

{ a: 1, 
    e: 2, 
    l: 1, 
    m: 1, 
    p: 1, 
    s: 1, 
    t: 2, 
    x: 1 }