2015-07-24 14 views
6

Ich arbeite gerade an einem Passwortstärke-Rechner und dann muss ich wissen, ob ein Zeichen mehr als einmal erscheint.
Ich weiß, ich muss regex wie diese occurance = password.match(/a/g).length verwenden, um ho viele Male a auftritt, aber ich möchte das mit jedem Zeichen (Buchstabe, Nummer, Symbol) tun.Grafische Darstellung jedes Zeichens

Gibt es eine Möglichkeit, dies mit JS/JQuery, vielleicht Regex, zu tun, außer mit einem Array zu arbeiten, das alle Zeichen enthält, die ich testen möchte?

+2

https://stackoverflow.com/questions/27224509/counting-the-number-of-times-each-value-in-the-array-appears-in -that-array-java?rq = 1 Hilft das? Sie können die Zeichenfolge in ein Array von Zeichen konvertieren und diese Methode verwenden – SlashmanX

+0

'password.length'? Nicht sicher, ob ich es verstehe. Bitte klären Sie die gewünschte Ausgabe. – Oriol

+0

@SlashmanX Scheint gut zu sein. Ich versuche es und sage Ihnen, wie es geht – tektiv

Antwort

8

So etwas wie das?

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

Ergebnis:

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

Oder Sie können Array. Ändern Sie einfach {} zu [].

+2

Danke, das hat funktioniert, wie ich wollte !! Übrigens, ich benutze eine Saite, also war das '{}' gut. Sie können auch 'histogram [letter] = (histogram [letter] || 0) + 1' anstelle Ihrer' if/else' Bedingung verwenden. Wie Sie bevorzugen – 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 wird ein Array von Arrays sein, die alle Übereinstimmungen von sich wiederholenden Zeichen enthalten.

Die RegExp verwendet eine Vorschau, um herauszufinden, ob ein gefundenes Zeichen (in der ersten Gruppe erfasst) später in der Zeichenfolge wieder angezeigt wird.

Ein Passwort wie secret elements kommen würde, wie:

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

Das zweite Element in jedem Sub-Array ist der mehrfach abgestimmte Charakter.

Wenn es keine Wiederholungen der Array-Länge haben = 0, die einfach zu testen, wie:

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

Gut gearbeitet danke, aber auf den ersten Blick schwer zu entziffern. Ich bevorzuge "SlashManX" Lösung, die verständlicher ist – tektiv

5

Von @Noel Jose Antwort here, können Sie einfach diese Funktion nach dem Konvertieren der Zeichenfolge in ein Array string.split('') ausführen.

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

in 'Test' Passing in der folgenden Ausgabe führen:

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

Haha. Ich dachte an [diese Antwort] (http://stackoverflow.com/a/27224747/4864023), während ich über diesen Beitrag rede ^^ Aber du hast mich dorthin gebracht, also verdienst du diese Antwort !! Danke noch einmal ! – tektiv

+0

@tektiv, dass die Antwort einige zusätzliche Berechnungen enthielt, also entschied ich mich, den einfacheren zu posten. Wenigstens hast du das, was du gesucht hast – SlashmanX

3

Wenn Sie ein "Array-basierte" Lösung verwenden möchten, können Sie so etwas wie dies versuchen:

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

Sie durchlaufen das Kennwort einmal und behalten die Ereignisse jedes gefundenen Zeichens im Auge. In diesem Fall wird das Array „Freq“ wäre so etwas wie dieses:

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

Das funktioniert gut, danke dafür. Anstatt "if/else" zu verwenden, können Sie auch 'freq [password [i]] == (freq [password [i]] || 0) + 1' verwenden. – tektiv

+0

Ja klar, das wäre ein" sauberer "Ansatz! –

0

einfach Ihre Zeichenfolge in ein Zählobjekt reduzieren. Setzen Sie die Reduktion auf ein leeres Objekt, jedes Mal, wenn ein Buchstabe gefunden wird, erhält dieser Buchstabe in dem Objekt, in dem der Index der Buchstabe ist, +1.

Hergestellt in eine wiederverwendbare Funktion

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} 
Verwandte Themen