2016-08-15 9 views
0

Я использую JSBin для записи блока JS-кода для принятия входной строки, затем возвращаю каждую букву, содержащуюся в строке (удаляя повторяющиеся буквы и другие символы), а затем подсчитывая, сколько раз каждая буква использовалась в строке. Я пытаюсь интегрировать регулярное выражение для дополнительной практики.Частота подсчета каждой буквы - javascript

Код, который я написал, не удаляет дубликаты и не учитывает частоту каждого символа. Может кто-нибудь, пожалуйста, скажите мне, что я сделал неправильно?

Вот HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <title>JS Bin</title> 
</head> 
<body> 
    <input type="text" id="input"></input> 
    <button onclick="count()">Count letters</button> 
    <br> 
    <br> 
    <div id="output">Result</div> 
</body> 
</html> 

Вот JS:

function count() { 
    var x = document.getElementById("input").value.toString(); 
    var y = ""; 
    var z = []; 

//Removal of white spaces and other characters. 

    x = x.replace(/[^a-z]/gi,""); 

//Elimination of duplicate letters. 

    for (var i = 0; i < x.length; i++) { 
    if (/x.charAt(i)/i.test(y) === false) { 
     y += x.charAt(i); 
    } 
    } 

//Count how many of each letter exists within the input string. 

    for(var i = 0; i < y.length; i++) { 
    for (var j = 0; j < y.length; j++) { 
     var freq = 0; 
     if (y.charAt(i) == y.charAt(j)) { 
     freq += 1; 
     } 
     z.push(freq); 
    } 
    } 

//Write result to HTML document. 

    for (var i = 0; i < y.length; i++) { 
    document.write(y.charAt(i)); 
    document.write(", "); 
    document.write(z[i]); 
    document.write("<br>"); 
    } 
} 

Большое вам спасибо за вашу помощь!

+0

Пожалуйста, пожалуйста, пожалуйста, не используйте имена переменных односимвольные. 'x',' y' и 'z' не являются описательными, и даже вы не сможете понять, что они означают через месяц. Кроме того, почему вы удаляете «дубликаты» писем? Что именно это значит? Что вы пытаетесь удалить? –

+0

Понял - я просто пишу быстрый код как практику, а затем удаляю. Я бы использовал более описательные переменные для проектов, которые я намерен сохранить. Извините за любую путаницу. – CJamz

+0

Чтобы удалить дубликаты, по существу, я хотел бы принять «привет» и преобразовать в «helo» - тогда вывод будет считать h 1, e 1, l 2, o 1 - поскольку исходная строка имела два экземпляра буквы l , и один экземпляр друг друга. – CJamz

ответ

0

Вы думаете слишком сложно. Просто перебирать нормированную строку, и сосчитать буквы:

window.count = function() { 
    var input = document.getElementById("input").value.toString(); 
    var result = {}; 

    input = input.replace(/[^a-z]/gi,""); 
    var letters = input.split(''); 
    for(index in letters) { 
    result[letters[index]] = result[letters[index]] +1 || 1; 
    } 
    document.querySelector('#output').innerHTML = JSON.stringify(result); 
} 

demo fiddle

+0

Спасибо Богдану! Гораздо проще. – CJamz

0

Вы можете сделать это в одной функции замены. Это пример.

function getFreq(str){ 
 
     var freq={};//an object to fill 
 
     /*var tmp = result not required*/ str.toLowerCase() 
 
       .replace(/[a-z]/ig, function(match /*that is [a-z]*/){ 
 
        freq[match] = (freq[match] || 0) + 1;//fill object 
 
        return match;//do not change str 
 
        }); 
 
     console.log(JSON.stringify(freq)); 
 
     return freq; 
 
    } 
 
<input type="text" onchange="getFreq(this.value);" />

Смежные вопросы