2012-06-27 6 views
-2

개인적인 용도로 텍스트 조각에있는 각 문자의 수를 세는 작은 자바 스크립트를 만들려고합니다. 나는 각각의 글자에 대해 개별 루프가있는 이전 버전을 가지고 있었지만 효과가 있었다. 그러나 오히려 길고 생성하기가 지루했다. 그래서 더 짧은 것을 만들려고 노력했는데, 그것이 효과가없는 이유를 알아 내지 못합니다. 감사!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를 지원하고자하는 경우, 그것은 새로운 map 또는 reduce 코드의 아주 작은 비트를 가지고 사용할 수 있습니다.

주어진 문자열은 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 }