18

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

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

4

20 回答 20

34

干得好:

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;
};
于 2013-09-04T17:13:25.270 回答
19

一些带有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 }
于 2017-03-06T22:41:58.537 回答
9

另一种解决方案:

function count (string) {  
  var count = {};
  string.split('').forEach(function(s) {
     count[s] ? count[s]++ : count[s] = 1;
  });
  return count;
}
于 2014-04-04T11:59:48.447 回答
6

具有一些 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}
)  

于 2019-10-29T03:02:38.550 回答
4

这是另一种方式:

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,等等。

简单、优雅、简洁。

于 2017-11-29T07:00:50.840 回答
3

获取单词直方图的更具说明性的方法是利用 reduce 遍历字母并提出一个新对象,其中包含字母作为键和频率作为值。

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}

于 2016-12-11T13:34:00.167 回答
1

更精简、更实用的解决方案:

使用 ES6 箭头 && 逻辑运算符:

const buildFreqDict = string =>
  string.split('').reduce((freqDict, char) => {
    freqDict[char] = (freqDict[char] || 0) + 1;
    return freqDict;
  }, {})

console.log(buildFreqDict("banana"))

解释

  • 将字符串拆分为字符数组。
    • 然后将其输入reduce方法(使用method.chaining())。
  • 如果char已经在countDict中登录,则向其添加 1。
    • 或者如果在countDict中找不到字符,则将其设置为 1。
  • 返回新值备份以减少的累加器对象
  • 注意:不要忘记包含.reduce()的第三个参数:在这种情况下,它是一个{}(对象文字),用于初始化freqDict对象。

有关更多信息,请参阅在页面中间的对象中计算值的实例: MDN Reduce
,有关使用逻辑运算符的更多信息,请参阅此处:MDN 逻辑运算符

于 2018-02-06T05:09:00.337 回答
1

一个简单的方法。此外,它还为您提供按字母顺序排序的列表。它遍历一个数组并评估字符是否已经在对象中:如果为假,则将字符添加到对象中,如果为真,则其频率增加一个单位。

const text= "Lorem ipsum dolor sit amet consectetur adipiscing"
const textAsArray = text.split('').sort()
let charactersList = {}

for (char of textAsArray) {

   if (!charactersList[char]) {
    charactersList[char]=1;
   }
   else {
    charactersList[char]++
  }
}

console.log(charactersList)   
于 2019-09-28T19:31:48.417 回答
1

我已经审查过,我认为这非常适合他们提出的需求。我希望它在一行中,但我不知道如何动态生成对象。

const uniqueCount=(arr)=>{
let rs ={};
arr.sort().join("").match(/(.)(\1*)/g).map(i=>rs[i[0]]=i.length);
return rs;
};
console.log(uniqueCount(["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"]));
//{ a: 3, b: 2, c: 2, d: 2, e: 2, f: 1, g: 1, h: 3 }

如上所述,我发现使用.match()和正则表达式非常成功。/(.)(\1*)/g

如果它只是一个字符串,你只需要在前面添加一个.split("")就可以了。

于 2019-10-20T22:37:59.127 回答
1

另一个按字母顺序排序的版本。此功能适用于两者。

  1. 按字母顺序排列的字符频率
  2. 按出现顺序排列的字符频率

警告:仅当整个字符串为小写时才有效

function freqWithAlphabetTable(str, doNeedToSort) {
    let cnt = new Array(26).fill(0), firstLowerCase = 97, output = {}
    for (let i = 0; i < str.length; i++)
        cnt[str[i].charCodeAt(0) - firstLowerCase]++ // filling the array with count at it's index
    if (doNeedToSort) {
        for (let i = 0; i < cnt.length; i++) {
            if (cnt[i] !== 0)
                output[String.fromCharCode(firstLowerCase)] = cnt[i]
            firstLowerCase++;
        }
    } else {
        for (let i = 0; i < str.length; i++) {
            let letterIndexVal = cnt[str[i].charCodeAt(0) - firstLowerCase];
            if (letterIndexVal != 0 ) {
                output[str[i]] = letterIndexVal
                letterIndexVal = 0 // replacing it with zero to avoid repetition
            }
        }
    }
    console.log(output);
    return output;
}
于 2021-01-31T15:57:00.910 回答
0

这是使用 underscore.js 的另一个选项:

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

charCount('aaabbbbdd')输出Object {a: 3, b: 4, d: 2}

于 2013-09-04T17:19:55.017 回答
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);
于 2013-09-04T17:20:39.877 回答
0

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

于 2017-09-15T18:13:59.860 回答
0
// Count frequency of characters in a string
// input: 'Hello, I'm Paul!'
// result: {
//      H: 1,
//      E: 1,
//      L: 3,
//      ... and so on ...
// }

const countChars = (string) => {
    let charStats = {};
    string = string.replace(' ', '').toUpperCase().split('');

    string.forEach((char) => {
        if (charStats[char]) {
            charStats[char]++;
        } else {
            charStats[char] = 1;
        }
    });

    return charStats;
};
于 2018-06-25T08:40:13.603 回答
0

另一种解决方案

    function maxChar(str) {

        const charMap = {};
        let max = 0;
        let maxChar = '';

        for(let char of str){
            if(charMap[char]){
                charMap[char]++;
            }else{
                charMap[char] = 1;
            }
        }

        for(let char in charMap){
            if(charMap[char] > max){
                max = charMap[char];
                maxChar = char;
            }
        }

        return maxChar; 
}

===>

 maxChar('355385') 
  "5"
于 2018-07-14T16:06:19.117 回答
0
var str = 'abcccdddd';

function maxCharCount(target) {
    const chars = {};

    let maxChar = '';
    let maxValue = 1;

    for (let char of target) {
        chars[char] = chars[char] + 1 || 1;
    }

    return chars;
}

console.log(maxCharCount(str));
于 2018-11-05T23:49:13.657 回答
0

相同的解决方案,但重构。太酷了,我们如何用这么多不同的答案来解决这个问题:)

function getFrequency(string) {

    var freq = {};

    for (let character in string) {

         let char = string[character];        
         (freq[char]) ? freq[char]++ : freq[char] = 1

    }

    return freq;

};
于 2019-03-19T17:45:46.200 回答
0

你可以使用这个。只需传递字符串,它将返回具有所有字符频率的对象。

function buildCharMap(string) {
  const charMap = {};
  string.replace(/[^\w]/g, '').toLowerCase();
  for (let char of string) {
    charMap[char] = charMap[char] + 1 || 1;
  }
  return charMap;
}
于 2019-09-06T22:49:20.020 回答
0

计算字符串中字符频率的作弊码是

let target = "e";
let string = " i want to see that person that came in here last";
let frequency = string.split(target).length - 1;

或全部在一行

console.log(string.split("e").length - 1)
于 2019-09-10T23:54:19.967 回答
0
 [...str].map( char => map.get(char) ? map.set( char, map.get(char) + 1) : map.set(char,1) ) 
于 2020-10-26T12:55:23.667 回答