前端统计字符串某个字符出现频率

以字符"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');

较比第一种方法,更好一些,但依旧不如分割统计在这里插入图片描述
reaplcematch都出来了,那还能忘了正则匹配统计嘛

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

比较了几种方法,还是分割统计法更胜一筹。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值