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

IT技术 javascript
2021-01-21 15:46:12

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

例如: "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));

6个回答

干得好:

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;
};
上面的代码可以用一个 liner (freq[character] = freq[character] + 1 || 1) 替换,但当我用 freq[character] = freq[character]++ || 替换时,它可以工作 1 它应该可以工作,但它并不总是对所有字符计数 1。为什么?你能解释一下吗?
2021-03-23 15:46:12
任何人都可以解释一下 if (freq[character]) 在上面的代码中是如何工作的。它完美地解决了我的问题。我使用调试器来查找它是如何工作的。但仍然没有得到它背后的逻辑是什么。谢谢
2021-03-27 15:46:12
在 javascript 中,一个undefined值等于 false。通过检查,if(freq[character])您正在检查 的值是否freq[character]为假(即:undefined、 0 null、 等)。因为我们在1那个 if 语句中初始化匹配字符的值,只有在之前遇到并计算过该字符时才会进入,否则我们初始化它
2021-04-06 15:46: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 }

另一种解决方案:

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

使用一些 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}
)  

我在你上面的代码中有一个查询 (a[c] = a[c] + 1 || 1) 它有效但是当我替换为 a[c] = a[c]++ || 1 它应该可以工作,但它并不总是对所有 char 计数 1。为什么?你能解释一下吗?
2021-03-27 15:46:12
@Infinity x++ 递增并返回x值。所以 x = x++ 将增加 x 并再次将其设置为旧值。将其更改为 ++x,它应该可以工作。
2021-04-08 15:46:12

这是另一种方式:

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

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

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

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

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

因此,我们可以遍历字符串的字符,并在freq[c]没有任何“if”的情况下简单地递增我们第一次遇到字符c,freq[c]将是未定义的,因此我们将其设置为-~freq[c]which is 1如果我们随后c再次遇到,我们再次设置freq[c]-~freq[c],现在将是2等。

简洁,优雅,简洁。