2015-07-24 5 views
6

В настоящее время я работаю над калькулятором прочности пароля, а затем мне нужно знать, появляется ли символ более одного раза.
Я знаю, что должен использовать regex вот так occurance = password.match(/a/g).length, чтобы получить ho много раз a происходит, но я хочу сделать это с каждым символом (буквой, числом, символом).Подсчет символов каждого символа

Есть ли способ сделать это с помощью JS/JQuery, может быть, регулярное выражение, кроме работы с массивом, который содержит все символы, которые я хочу проверить?

+2

https://stackoverflow.com/questions/27224509/counting-the-number-of-times-each-value-in-the-array-appears-in -Вот-массив в Java?rq = 1 Это помогает? Вы можете преобразовать строку в массив символов и использовать этот метод – SlashmanX

+0

'password.length'? Не знаю, понимаю ли я. Просьба уточнить желаемый результат. – Oriol

+0

@SlashmanX Кажется, что это хорошо. Я попробую и расскажу вам, как это происходит. – tektiv

ответ

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 } 

Или вы можете использовать массив. Просто измените {} на [].

+2

Спасибо, это сработало, как я хотел !! Btw, я использую строку, поэтому '{}' было хорошо. Кроме того, вы можете использовать 'histogram [letter] = (гистограмма [буква] || 0) + 1' вместо вашего условия' if/else'. Как вы предпочитаете – tektiv

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"]]" 

Второй элемент в каждом суб-массива умножить соответствующий символ.

Если нет повторений массив будет иметь длину = 0, которую легко проверить, как:

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

Хорошо работает, но трудно разобраться с первого взгляда. Я предпочитаю решение «SlashManX», которое более понятно – tektiv

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

Переходя в «тестирования» приведет к следующему выходу:

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

Ха-ха. Я думал о [этом ответе] (http://stackoverflow.com/a/27224747/4864023), когда говорил об этом посту ^^ Но ты привел меня туда, чтобы заслужить этот ответ! Еще раз спасибо ! – tektiv

+0

@tektiv этот ответ имел некоторые дополнительные вычисления в нем, поэтому я решил опубликовать более простой. По крайней мере, вы получили то, что искали. – SlashmanX

3

Если вы хотите использовать решение «на базе массива», вы можете попробовать что-то вроде этого:

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

Вы повторяете пароль один раз и следите за выводами каждого персонажа, который вы найдете. В этом случае массив «частота» будет иметь что-то вроде этого:

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

Это хорошо работает, спасибо за это. Однако вместо использования условия 'if/else' вы также можете использовать' freq [password [i]] == (freq [пароль [i]] || 0) + 1' – tektiv

+0

Да, конечно, это будет " чище "! –

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} 
Смежные вопросы