我目前正在使用密码强度计算器,然后我需要知道某个字符是否出现多次。
我知道我必须使用regex
像这样occurance = password.match(/a/g).length
来多次a
出现,但我想对每个字符(字母,数字,符号)这样做。
有没有办法使用JS / JQuery,也许正则表达式,除了使用包含我想要测试的所有字符的数组?
答案 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}