计算每个角色的外观

时间:2015-07-24 13:22:40

标签: javascript jquery

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

有没有办法使用JS / JQuery,也许正则表达式,除了使用包含我想要测试的所有字符的数组?

5 个答案:

答案 0 :(得分:8)

这样的东西?

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 }

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

答案 1 :(得分:5)

从@Noel Jose的回答here,您可以在将字符串转换为数组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]);
}

通过&#39;测试&#39;将产生以下输出:

e : 1
g : 1
i : 1
n : 1
s : 1
t : 2

答案 2 :(得分:3)

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

res将是一个包含所有重复字符匹配的数组数组。

RegExp使用预先查找找到的字符(在第一组中捕获)是否会在字符串中稍后重新出现。

secret elements之类的密码会显示为:

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

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

如果没有重复,则数组将具有length = 0,这很容易测试,如:

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

答案 3 :(得分:3)

如果你想使用&#34;基于数组的&#34;解决方案,您可以尝试这样的事情:

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

您迭代密码一次,并跟踪您找到的每个角色的偶然性。 在这种情况下,阵列&#34; freq&#34;会有类似的东西:

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

答案 4 :(得分:0)

只需将字符串缩减为计数对象即可。使用空对象对减少进行种子处理,每次遇到一个字母,然后该字母在索引为字母的对象中收到+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}