今天在微信上看到一篇關於前端面試題的文章,其中有一道題是找出字符串 var str = 'aaaabbbcccdfg' 的相同字符個數。看了里面的答案,感覺有點難懂,而且運行的時候報錯。估計是代碼寫的有問題,自己也修復了一些,但還是報錯,看來技術有限。
現在把我自己寫的記錄下來,感覺簡單易懂,使用方便,如下:
現在把我自己寫的記錄下來,感覺簡單易懂,使用方便,如下:
var str = '231452erfsdg35@#¥%63erefds我是大神';
console.log(strNubAry(str)); //打印成數組
console.log(strNubObj(str)); //打印成對象
//計算成數組 & 當字符串里有數字或特殊字符的時候建議使用數組
function strNubAry(str){
var ary = [];
fnFas(str);
function fnFas(str){
var s1 = str.charAt(0);
var _str = '';
var n = 0;
for (var i = 0; i < str.length; i++) {
if(str.charAt(i) == s1)
n++;
else
_str += str.charAt(i);
}
ary.push(s1+'='+n)
if(_str.length > 0){
fnFas(_str);
}
}
return ary;
}
//計算成對象
function strNubObj(str){
var obj = {};
var ary = [];
fnFas(str);
function fnFas(str){
var s1 = str.charAt(0);
var _str = '';
var n = 0;
for (var i = 0; i < str.length; i++) {
if(str.charAt(i) == s1)
n++;
else
_str += str.charAt(i);
}
try{
eval('obj.'+s1+'='+n)
}catch(err){
ary.push(s1+'='+n)
}
if(_str.length > 0){
fnFas(_str);
}
}
if(ary.length > 0){
obj.aNumber = ary;
}
return obj;
}
這里我寫了兩個方法,一個是用數組顯示,一個是用對象顯示。為什么要寫兩個方法呢,其實兩個方法基本一樣,也可以合並成一個方法,只是分兩個方法看起來更容易懂。這里的對象方法有個小問題,就是如果字符是數字或特殊字符,那么eval()函數就會報錯,這里給出增加對象屬性 aNumber 把 是數字的字符存儲為數組賦值給它,但然aNumber這樣命名肯能不會很貼切,暫時就這么命名吧。但如果用顯示成數組那么就沒什么問題了。