统计每个字符的出现次数

Count appearance of each character

本文关键字:字符 统计      更新时间:2023-09-26

我目前正在开发密码强度计算器,然后我需要知道一个字符是否多次出现
我知道我必须像使用occurance = password.match(/a/g).length一样使用regex来获得a出现的次数,但我想对每个字符(字母、数字、符号(都这样做。

除了使用包含我想要测试的所有字符的数组之外,有没有其他方法可以使用JS/JQuery(可能是regex(来实现这一点?

类似的东西?

var hello = "Hello world";
var histogram = {};
for (var i = 0, len = hello.length; i < len; i++) {
    var letter = hello[i];
    histogram[letter] = (histogram[letter] || 0) + 1;
}
console.log(histogram);

结果:

{ H: 1, e: 1, l: 3, o: 2, ' ': 1, w: 1, r: 1, d: 1 }

或者您可以使用数组。只需将{}更改为[]即可。

根据@Noel Jose的答案,您可以在将字符串转换为数组string.split('')后简单地运行此函数。

function foo(arr) {
    var a = [], b = [], prev;
    arr.sort();
    for( var i = 0; i < arr.length; i++ ){
        if ( arr[i] !== prev ) {
            a.push(arr[i]);
            b.push(1);
        } else {
            b[b.length-1]++;
        }
        prev = arr[i];
    }
    return [a, b];
}
var stringToCheck = 'password';
var result = foo(stringToCheck.split(''));
// result[0] contain unique array elements and result[1] contain number of occurrences of those elements
for(var i = 0; i < result[0].length; i++){
    console.log(result[0][i] + " : " + result[1][i]);
}

通过"测试"将产生以下输出:

e : 1
g : 1
i : 1
n : 1
s : 1
t : 2
function rall(r, s) {
 var a=[],t,g=r.global;
 do {t=r.exec(s);if (!t) break;
     a.push(t);} while (g);
 return a;
}
var r=/.*?(.)(?=(.*?'1.*))/g;
var res=rall(r,password);

CCD_ 7将是包含所有重复字符匹配的数组的数组。

RegExp使用前瞻性来确定找到的字符(在第一组中捕获的(稍后是否会重新出现在字符串中。

secret elements这样的密码会显示为:

"[["s","s","ecret elements"],
 ["e","e","cret elements"],
 ["cre","e","t elements"],
 ["t","t"," elements"],
 [" e","e","lements"],
 ["le","e","ments"]]"

每个子数组中的第二个元素是相乘匹配的字符。

如果没有重复,数组的长度将为0,这很容易测试,比如:

if (rall(r,password).length==0)
  console.log('password is OK!');

如果你想使用"基于阵列"的解决方案,你可以尝试这样的方法:

var password= "abcdsa";
var freq = [];
for(var i = 0 ; i < password.length ; i++){
  freq[password[i]] = (freq[password[i]] || 0)+1;
}

您对密码进行一次迭代,并跟踪您找到的每个字符的位置。在这种情况下,数组"freq"会有这样的东西:

freq["a"] = 2;
freq["b"] = 1;
freq["c"] = 1;
freq["d"] = 1:
freq["s"] = 1;

只需将字符串简化为count对象。用一个空对象作为减少的种子,每次遇到字母时,该字母在索引为字母的对象中都会收到+1。

制成可重复使用的功能

function charCount(str){
 return [].reduce.call(str,function(p,c){
  p[c] = p[c] ? p[c]+1 : 1; 
  return p;
 },{});
}
charCount("hello");//Object {h: 1, e: 1, l: 2, o: 1}