使用javascript计算字符串中字符的频率

Sam*_*rat 12 javascript

我需要编写某种循环来计算字符串中每个字母的频率.

例如:"aabsssd"

输出:a:2,b:1,s:3,d: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));
Run Code Online (Sandbox Code Playgroud)

Jon*_*owe 21

干得好:

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 在javascript中,`undefined`值等于false.通过检查`if(freq [character])`你正在检查`freq [character]`的值是否为falsey(即:`undefined`,0,`null`等).因为我们将匹配字符的值初始化为"1",所以只有在先前遇到并计算过该字符时才会输入if语句,否则我们将其初始化 (3认同)

rus*_*mer 12

一些带有reduce的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 }
Run Code Online (Sandbox Code Playgroud)


sar*_*ast 7

另一种方案:

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


Yon*_*tch 7

这是另一种方法:

const freqMap = s => [...s].reduce((freq,c) => {freq[c] = -~freq[c]; return freq} ,{})
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢“for”循环:

function freqMap(s) { 
   freq={}; 
   for (let c of s) 
      freq[c]=-~freq[c]; 
   return freq;
}
Run Code Online (Sandbox Code Playgroud)

例如freqMap("MaMaMia")退货Object{M : 3, a : 3, i : 1}

此方法利用了这样一个事实:在 javascript 中,按位非“未定义”给出 -1(而“未定义+1”给出 NaN)。所以,-~undefined1-~12-~23等等。

因此,我们可以迭代字符串的字符,并且简单地递增而freq[c]无需任何“if”。第一次遇到字符c,freq[c]是未定义的,所以我们将其设置为-~freq[c]is 1。如果我们随后c再次遇到,我们再次设置freq[c]-~freq[c],现在将是2,等等。

简单、优雅、简洁。


fre*_*k99 5

使用一些 ES6 特性和短路:

const counter = s => [...s].reduce((a, c) => (a[c] = a[c] + 1 || 1) && a, {})

console.log(
  counter("hello") // {h: 1, e: 1, l: 2, o: 1}
)  
Run Code Online (Sandbox Code Playgroud)