2013-09-04 3 views
8

Мне нужно написать какой-то цикл, который может подсчитывать частоту каждой буквы в строке.подсчет частоты символов в строке с использованием javascript

Например: "aabsssd"

Выход: а: 2, б: 1, S: 3, г: 1

хотите также отображать же характер, как имя свойства в объекте. Любая хорошая идея, как это сделать?

Я не уверен, как это сделать.

Это где я до сих пор:

var arr = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; 

function counter(x) { 
    var count=0, temp = []; 
    x = x.split(''); 
    console.log(x); 
    for(var i=0, len = x.length; i < len; i++) { 
     if(x[i] == "a") { 
      count++; 
     } 
    } 
    return count; 
} 
var a = "aabbddd"; 
console.log(counter(a)); 
+4

Вы пробовали что-нибудь? Не могли бы вы предоставить нам образец вашего кода? – Sebastien

+0

Возможный дубликат http: // stackoverflow.com/questions/4009756/how-to-count-string-entry-in-string –

+0

Пожалуйста, покажите свои попытки решить проблему, а затем ответы могут напрямую критиковать код, который вы предоставляете. – apsillers

ответ

15

Здесь вы идете:

function getFrequency(string) { 
    var freq = {}; 
    for (var i=0; i<string.length;i++) { 
     var character = string.charAt(i); 
     if (freq[character]) { 
      freq[character]++; 
     } else { 
      freq[character] = 1; 
     } 
    } 

    return freq; 
}; 
+0

неплохо неплохо – kangoroo

+0

Он работает отлично. Jsfiddle: http://jsfiddle.net/creativevilla/wjD2r/2/ – Samrat

+0

Может кто-нибудь объяснить, как ** if (freq [character]) ** это работает в приведенном выше коде. Это прекрасно решает мою проблему. Я использовал отладчик, чтобы найти, как он работает. Но все еще не понимает, что за этим стоит. Спасибо –

0

Вот еще один вариант использования underscore.js:

function charCount(str) { 
    return _(str.split('')).countBy(function(char) { 
     return char.toLowerCase(); 
    }); 
} 

charCount('aaabbbbdd') выходы Object {a: 3, b: 4, d: 2}

0
for(i = strlen(string)var string = 'aabsssd'; 
var chars = new Array(); 
for(var i = 0; i < string.length; i++){ 
    var char = string.charAt(i); 
    if(chars[char] == undefined){ 
     chars[char] = 0; 
    } 
    chars[char]++; 
} 
console.log(chars); 
5

Другое решение:

function count (string) { 
    var count = {}; 
    string.split('').forEach(function(s) { 
    count[s] ? count[s]++ : count[s] = 1; 
    }); 
    return count; 
} 
1

Более декларативный способ получить слово гистограмма будет использовать сократить перебирать письма и придумать новый объект, который содержит буквы в качестве ключей и частот в качестве значений.

function getFrequency(str) { 
 
    return str.split('').reduce((prev, curr) => { 
 
    prev[curr] = prev[curr] ? prev[curr] + 1 : 1; 
 
    return prev; 
 
    }, {}); 
 
}; 
 

 
console.log(getFrequency('test')); // => {t: 2, e: 1, s: 1}

3

некоторые ES6 синтаксис с уменьшения:

let counter = str => { 
    return str.split('').reduce((total, letter) => { 
    total[letter] ? total[letter]++ : total[letter] = 1; 
    return total; 
    }, {}); 
}; 

counter("aabsssd"); // => { a: 2, b: 1, s: 3, d: 1 } 
0

const recorrences = ['a', 'b', 'c', 'a', 'b','a'] 
 
       .map(i => !!~i.indexOf('a')) 
 
       .filter(i => i) 
 
       .length; 
 
console.log(`recorrences ${recorrences}`) 
 
//recorrences 3

0

Вот еще один способ:

function freqMap(s) { 
    freq={}; 
    for (var c of s) 
     freq[c]=-~freq[c]; 
    return freq; 
} 

, например. freqMap («MaMaMia») возвращает объект {M: 3, a: 3, i: 1}

Этот метод использует тот факт, что в javascript побитовое значение не указано «undefined» дает -1 (тогда как «undefined + 1 "дает NaN). Итак, - ~ undefined равно 1, - ~ 1 равно 2, - ~ 2 равно 3 и т. Д.

Таким образом, мы можем перебирать символы строки и просто увеличивать частоту [c] без каких-либо «if». В первый раз, когда мы сталкиваемся с символом c, freq [c] будет неопределенным, поэтому мы установили его в - ~ freq [c], который равен 1. Если мы снова столкнемся c c, мы снова установим freq [c] в - ~ freq [c], который теперь будет 2 и т. д.

Простой, элегантный, лаконичный.

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