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

时间:2013-09-04 17:02:07

标签: 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));

20 个答案:

答案 0 :(得分:19)

你走了:

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;
};

答案 1 :(得分:9)

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

答案 2 :(得分:6)

另一种解决方案:

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

答案 3 :(得分:2)

获得单词直方图的更多声明性方法是利用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}

答案 4 :(得分: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;
}

答案 5 :(得分: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"

答案 6 :(得分:0)

 [...str].map( char => map.get(char) ? map.set( char, map.get(char) + 1) : map.set(char,1) ) 

答案 7 :(得分:0)

新的JS功能的混合和一些短路。

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

counter("hello") // {h: 1, e: 1, l: 2, o: 1}

答案 8 :(得分:0)

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

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("")就可以了。

答案 9 :(得分:0)

一种简单的方法。此外,它还为您提供了按字母顺序排序的列表。它会遍历一个错误并评估角色中是否已存在该字符:如果为false,则将该字符添加到该对象中;如果为true,则其频率会增加一个单位。

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)   

答案 10 :(得分:0)

用来计算字符串中字符的频率的欺诈代码是

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

或全部一行

console.log(string.split("e").length)

答案 11 :(得分:0)

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

function buildCharMap(string) {
  const charMap = {};
  string.replace(/[^\w]/g, '').toLowerCase();
  for (let char of string) {
    charMap[char] = charMap[char] + 1 || 1;
  }
  return charMap;
}

答案 12 :(得分:0)

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

.desc

答案 13 :(得分: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));

答案 14 :(得分: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;
};

答案 15 :(得分:0)

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

使用ES6 Arrows&amp;&amp;逻辑运算符:

  $(document).ready(function(){
    $(".dropdown, .btn-group").hover(function(){
        var dropdownMenu = $(this).children(".dropdown-menu");
        if(dropdownMenu.is(":visible")){
            dropdownMenu.parent().toggleClass("open");
    }
    });
});

解释

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

有关详细信息,请参阅 计算对象中值的实例 ,在此处显示页面的一半:MDN Reduce
有关使用 逻辑运算符 的详细信息,请参阅此处:MDN Logical Operators

答案 16 :(得分:0)

这是另一种方式:

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;
}

e.g。 freqMap(“MaMaMia”)返回Object {M:3,a:3,i:1}

这种方法利用了这样的事实:在javascript中,按位而不是“undefined”给出-1,(而“undefined + 1”给出NaN)。 所以,~~ undefined是1, - ~1是2, - 〜2是3等。

因此我们可以遍历字符串的字符,只需增加freq [c]而不使用任何“if”。我们第一次遇到一个字符c时,freq [c]将是未定义的,所以我们将它设置为 - ~freq [c],这是1.如果我们再次遇到c,我们再次将freq [c]设置为 - ~freq [c],现在将是2,等等。

简洁,优雅,简洁。

答案 17 :(得分:0)

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

答案 18 :(得分: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);

答案 19 :(得分:0)

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

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

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