今天在微信上看到一篇关于前端面试题的文章,其中有一道题是找出字符串 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这样命名肯能不会很贴切,暂时就这么命名吧。但如果用显示成数组那么就没什么问题了。