以字符"UNjU38gEwP6a6xmxJL2oOSqXdkOB62XE4bita7esl0iLz1VcJRiBPrf7YFBBPSSQ7LMw38vNbD8zyOMfaGOK7goeC6SpWaR1C3Gtygg5vMM3vTkCOlE3ROlwNjNHm9MC76I3pguvWmaiRoUMajgGKHBHdTfZ2k0k9Q6KmiAfWXW3jfTsvxFUv1zV4W3DIwXiksQGu4wu0jK7Kqb6c4Zju2H6SNyKjFvRBe3xslQMIBTWo08ESsuHCsjo9WEHjz1aaWuBaF8t8iNp5ZIiFIsKoOgAsKXoqLh4C4okdGpC5B41NOcHrXQXMyftYuvmwUPxwMWCLQJP9nOiP24f5eZRxZSTNhWEaxIBFo17EPIDjsD5WlyGVhGU5xKHfyVkk2HMs3ArgcFew9DLA1bTFeLkObX4Qevie1pZOFfEDF4gESWkNrdfxEiwZOk19iKN5KaZQoS2XpkK21hx5Fnso9Bqmgpi5wdWCc3lf4FYDol4A3T0mRaZqO7N"为测试字符串
最容易想到的应该数forOf遍历了,自然而然就得到第一种方法(方法不止一种,就要看一下花费时长):
1. 利用for…of遍历
function OfHappen(str, v) {
let num = 0;
for (const i of str) {
i == v ? num++ : '';
}
return num;
}
console.time('forOf');
console.log('出现的次数:'+OfHappen(str, 's'));
console.timeEnd('forOf');
运行多次,得出结果所需要完成时长在0.12ms~0.32ms之间
for…of遍历,自然而然就会想到是不是能把字符串变成数组,然后对数组遍历,但是这样在性能和时长长就会花费较多一些,似乎得不偿失,这样一想,是不是可以不遍历可以统计字符出现的次数,那另一条路就出来了:分割
2.分割统计法
function splitOfHappen(str, v) {
let num = str.split(v).length - 1;
return num;
}
console.time('split');
console.log('出现的次数:'+splitOfHappen(str, 's'));
console.timeEnd('split');
和第一种方法相比,快了不少
上述方法可以理解为因为分割把那个特指的字符变没了,那是不是能把它替换也能统计呢,有就把这个字符串替换掉,直至全部替换完(repalce),那不就也能统计出字符出现的次数。
3. replace替换统计法
怎么确定字符是否还有这个特定的字符,这是个问题,难道也去遍历嘛?还是换成数组利用includes?hasOwnProperty? 想到这,我觉得我是个傻嗨, emm…,我好像忘了一个东西,match()方法,可在字符串内检索指定的值,可行!
function replaceOfHappen(str,v){
let num = 0;
while(str.match(v)){
str = str.replace(v,'');
num++;
}
return num;
}
console.time('replace');
console.log('出现的次数:'+replaceOfHappen(str, 's'));
console.timeEnd('replace');
较比第一种方法,更好一些,但依旧不如分割统计。
reaplce和match都出来了,那还能忘了正则匹配统计嘛
4. 利用正则统计
匹配一个特定的字符串我一般都这样写:str.replace(/\s/g,'x')
,这样的话一个不能做到统计,二个s的问题(不知是匹配s还是s仅仅是作为参数名而已),所以特地去看了一下正则匹配。正则是个好东西,在某些场景下能得到出乎意料的效果
function RegExpOfHappen(str, v) {
let num = 0;
str.replace(new RegExp(v, "g"),function(){
num++;
})
return num;
}
console.time('RegExp');
console.log('出现的次数:'+RegExpOfHappen(str, 's'));
console.timeEnd('RegExp');
比较了几种方法,还是分割统计法更胜一筹。