2015-07-24 21 views
6

Tôi hiện đang làm việc trên máy tính có độ mạnh mật khẩu và sau đó tôi cần biết liệu một ký tự có xuất hiện nhiều lần không.
Tôi biết tôi phải sử dụng regex như thế này occurance = password.match(/a/g).length để nhận ho nhiều lần a xảy ra, nhưng tôi muốn làm điều đó với mỗi ký tự (chữ cái, số, ký hiệu).Đếm diện mạo của mỗi ký tự

Có cách nào để làm điều đó bằng cách sử dụng JS/JQuery, có thể là regex, ngoài việc làm việc với một mảng chứa tất cả các ký tự tôi muốn kiểm tra?

+2

https://stackoverflow.com/questions/27224509/counting-the-number-of-times-each-value-in-the-array-appears-in -that-array-java?rq = 1 Điều đó có hữu ích không? Bạn có thể chuyển đổi chuỗi thành một mảng ký tự và sử dụng phương thức đó – SlashmanX

+0

'password.length'? Không chắc tôi có hiểu không. Vui lòng làm rõ đầu ra mong muốn. – Oriol

+0

@SlashmanX Dường như là tốt. Tôi thử nó và cho bạn biết làm thế nào nó đi – tektiv

Trả lời

8

Something như thế này?

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

Kết quả:

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

Hoặc bạn có thể sử dụng mảng. Chỉ cần thay đổi {} thành [].

+2

Cảm ơn, nó đã hoạt động như tôi muốn !! Btw, tôi đang sử dụng một chuỗi, do đó, '{}' là tốt. Ngoài ra, bạn có thể sử dụng 'histogram [letter] = (biểu đồ [chữ] || 0) + 1' thay cho điều kiện' if/else' của bạn. Bạn thích – 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 sẽ là mảng các mảng chứa tất cả các đối sánh của các ký tự lặp lại.

RegExp sử dụng giao diện phía trước để tìm hiểu xem ký tự tìm thấy (được ghi trong nhóm đầu tiên) sẽ xuất hiện lại sau trong chuỗi không.

Một mật khẩu như secret elements sẽ đi lên như:

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

Yếu tố thứ hai trong mỗi mảng phụ là nhân vật nhân phù hợp.

Nếu không có lặp lại mảng sẽ có chiều dài = 0 đó là dễ dàng để kiểm tra như:

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

Làm việc tốt nhờ, nhưng khó để đánh bại ngay từ cái nhìn đầu tiên. Tôi thích giải pháp 'SlashManX' dễ hiểu hơn – tektiv

5

Từ câu trả lời của @Noel Jose here, bạn có thể chỉ cần chạy hàm này sau khi chuyển đổi chuỗi thành mảng 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]); 
} 

Đi qua trong 'thử nghiệm' sẽ cho kết quả đầu ra sau đây:

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

Haha. Tôi đã nghĩ đến [câu trả lời này] (http://stackoverflow.com/a/27224747/4864023) trong khi nói về bài đăng này ^^ Nhưng bạn đã đưa tôi đến đó để bạn xứng đáng được trả lời này !! Cảm ơn một lần nữa! – tektiv

+0

@tektiv rằng câu trả lời có một số tính toán bổ sung trong đó, vì vậy tôi quyết định đăng bài đơn giản hơn. Ít nhất bạn có những gì bạn đang tìm kiếm – SlashmanX

3

Nếu bạn muốn sử dụng một giải pháp "mảng dựa trên", bạn có thể thử một cái gì đó như thế này:

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

Bạn lặp lại thông qua mật khẩu một lần và theo dõi các ocurrances của từng ký tự mà bạn tìm thấy. Trong trường hợp này các mảng "Thường" sẽ có một cái gì đó như thế này:

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

Điều đó hoạt động tốt, cảm ơn bạn vì điều này. Tuy nhiên, thay vì sử dụng điều kiện 'if/else', bạn cũng có thể sử dụng' freq [password [i]] == (freq [mật khẩu [i]] || 0) + 1' – tektiv

+0

Chắc chắn, đó sẽ là một " sạch hơn "cách tiếp cận! –

0

Đơn giản chỉ cần giảm chuỗi của bạn thành một đối tượng đếm. Hạt giống giảm với một đối tượng rỗng, mỗi khi một lá thư được gặp phải thì lá thư đó nhận được +1 trong đối tượng mà chỉ mục là chữ cái.

Made vào một chức năng tái sử dụng

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} 
Các vấn đề liên quan