之前偶然看到一篇使用正则实现字符去重及多行去重的文章。感觉写的有点糙,而且性能也不够高,对新手的使用和理解都有一点难度。于是忍不住就搞了一个比较可爱的出来。而且不是一般的可爱,因为随着字符量的增长,其性能甩出前者不知道多少条街。

知识点

这里的实现对知识点的要求非常的低,不论你是老司机还是菜鸟,基本上一眼就能看到其真谛;超好用的Array.from()[不知道?],当然你可以可以用经典的slice.call()来轻松搞定古董浏览器们;

Array口杯接口Array.prototype.reduce(Func[, initialValue]):Array|TypeLike[initialValue],它被广泛应用于各种求值操作,这里就不细讲了;

高颜值的String.prototype.match(string|RegExp):null|Array;

使用评率最高的Array.prototype.split(string|RegRxp):Array;

新的Array.prototype.includes(string):boolean,当然,你也可以使用其他接口如:indexOf()、find()、some()等;

正则表达式注意:本文不涉及对底层接口运行原理的解析。如有感兴趣,请自行查阅相关文档,进一步的了解前端的性能优化;

单行文本去重//单行文本去重

function SingleLineDistinct (str) {

// Array.prototype.slice.call(str|new String(str)) 可兼容不支持from接口的浏览器

return Array.from(str).reduce(

// 这里应该很好明白是在干什么吧?

(pre,cur) => (pre.match(cur) ? pre : pre + cur),

// 需要传入一个初始空字符串参数,否则你将得到的是一个字符串被拆分后的数组。

""

);

}复制代码

多行字符去重

多行字符去重直接就是基于单行去重的简单封装function MultiLineCharDistinct (mlstr) {

// 是不是超级简单?

return mlstr.split("\n").map(SingleLineDistinct).join("\n")

}复制代码

多行行去重

这个也是非常的简单的,用一下数组判断接口就行啦。function MultiLineDistinct (str, spl = "\n") {

// 这里就不能给reduce传入初始空字符串了,因为那样会返回

return str.split(spl).reduce(

// 判断一下,初始数组中有没有与当前行相同的字符串,没有则push当前行,并返回数组;

(pre,cur) => (!pre.includes(cur) && pre.push(cur),pre),

[]

)

// 进行行拆分

.join(spl);

}复制代码

见证奇迹的时刻到了

这里还是贴一下前面提到的运用正则进行单行去重的代码吧:function DistinctString(s){

var a;

while((a=s.replace(/(.)(.*?)\1/,"$1$2"))!=s) s=a;

return s;

}复制代码

接下来我们就来进行两个单行去重函数的性能进行比较了:【高能预警!】

首先,我们给SingleLineDistinct()和DistinctString()函数添加执行时间打印console.time()和console.timeEnd()[这里非本文重点,不做应用阐述],变成了这样:function DistinctString(s){

console.time('dstring');

var a;

while((a=s.replace(/(.)(.*?)\1/,"$1$2"))!=s) s=a;

console.timeEnd('dstring');

return s;

}复制代码//单行文本去重

function SingleLineDistinct (str) {

console.time('sldist');

str = Array.from(str).reduce(

(pre,cur) => (pre.match(cur) ? pre : pre + cur),

""

);

console.timeEnd('sldist');

return str;

}复制代码

我们定义一个let str = "lsdjfl...."的随机重复字符变量,然后就该它们俩发挥了:

咦~~,彼此彼此嘛...

DistinctString:不好意思,失误,再来!

DistinctString:SingleLineDistinct你等等我呀!

SingleLineDistinct:不好意思,你实在太慢了。

哈哈哈哈,怎么样,是不是很有趣?希望你各位喜欢。如果你们有更好更快的方法,欢迎交流哟~声明:本文的内容并不是对正则表达式的否定,正则的牛逼之处是无可替代的,请各位不要误解。仅仅是想通过这样一个栗子,告诉大家每一种方法都有它的长处和短处。想要编写高性能、高质量的代码,那么你就必须要了解其运行原理和底层技术,这样才能让你在编程时选择更好的代码组织模式,提高应用的执行效率。

js 对一个字段去重_JS单行、多行文本字符去重和行去重相关推荐

  1. js 对一个字段去重_js面试

    js面试题 1.简述同步和异步的区别 2.怎么添加.移除.复制.创建.和查找节点 3.实现一个函数clone 可以对Javascript中的五种主要数据类型(Number.string.Object. ...

  2. js 对一个字段去重_js正则去重及(?=)的匹配规则

    今天首先要讲的是如何利用正则去重复,例如有一串字符串'122345333',如何去其中的重复元素? var str='122345333'; while((str!=(str=str.replace( ...

  3. js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法

    js给对象添加变量属性 & js 更改对象中的属性名 & 数组对象中每个对象添加一个字段-map用法和forEarch用法 1.js给对象添加变量属性 1.js创建一个对象或者在原有对 ...

  4. 使用 ale.js 制作一个小而美的表格编辑器(4)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

  5. 如何用 Node.js 实现一个简单的 Websocket 服务?

    最近正在研究 Websocket 相关的知识,想着如何能自己实现 Websocket 协议.到网上搜罗了一番资料后用 Node.js 实现该协议,倒也没有想象中那么复杂,除去注释语句和 console ...

  6. 如何使用 JS 实现一个本地数据库?

    本文来自作者 郭方超 在 GitChat 上分享 「使用 JS 实现一个本地数据库」 编辑 | 杰伦 前端很多时候还是需要保存一些数据的,这里的保存指的是长久的保存.以前的思想是把数据保存在 Cook ...

  7. 如何用5000行JS撸一个关系型数据库

    首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...

  8. 使用 Vue.js 制作一个简单的调查问卷平台

    使用 Vue.js 制作一个简单的调查问卷平台 原文  https://github.com/pramper/Demos/tree/master/Vue-Demos/Questionnaire 主题  ...

  9. mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...

    点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...

最新文章

  1. 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
  2. IEEE CS:2021年的12大技术趋势
  3. 同时查找数组中最大和最小值
  4. 自制贴纸图案大全图片_重磅!Supreme x 山本耀司联名Bogo贴纸泄露,发售确认?!...
  5. Swift-binary search tree
  6. 数据挖掘算法之决策树算法总结
  7. 普诺飞思公布发明者社区,启发基于事件视觉技术的创新
  8. IAR常用快捷键及技巧
  9. linux 环境变量详解,Linux 环境变量详解及实例
  10. 解决Zarp报错,成功运行
  11. 高效编程之hashmap你不看就会忘记的知识点
  12. 多叉树的深度优先遍历并输出叶子路径
  13. MSN Messenger协议简介
  14. C语言 输出螺旋数组
  15. 2021 Alexa SmartHome Skill 对接(二)配置及服务对接
  16. Mysql将txt文件导入数据库采坑 load data local infile
  17. iPhone手机开发
  18. CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时有些文字消失了?
  19. Redux 异步数据流-- thunk中间件源码解析
  20. 嫁我是你一生的赌注,我怎么忍心让你输

热门文章

  1. java反射机制详解_Java反射机制详解
  2. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
  3. 连续子数组的最大和python_连续子数组的最大和
  4. CAN 总线 之七 BOSCH CAN 位时序 和 同步
  5. Oracle 原理: 闪回 flashback
  6. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
  7. 百度html删除,百度地图-删除默认版权信息
  8. Cpp 对象模型探索 / 对象的虚函数表指针的位置
  9. Linux下getopt()函数的简单使用
  10. java静态类和非静态类_关于java:静态和非静态内部类的区别?