js 对一个字段去重_JS单行、多行文本字符去重和行去重
之前偶然看到一篇使用正则实现字符去重及多行去重的文章。感觉写的有点糙,而且性能也不够高,对新手的使用和理解都有一点难度。于是忍不住就搞了一个比较可爱的出来。而且不是一般的可爱,因为随着字符量的增长,其性能甩出前者不知道多少条街。
知识点
这里的实现对知识点的要求非常的低,不论你是老司机还是菜鸟,基本上一眼就能看到其真谛;超好用的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单行、多行文本字符去重和行去重相关推荐
- js 对一个字段去重_js面试
js面试题 1.简述同步和异步的区别 2.怎么添加.移除.复制.创建.和查找节点 3.实现一个函数clone 可以对Javascript中的五种主要数据类型(Number.string.Object. ...
- js 对一个字段去重_js正则去重及(?=)的匹配规则
今天首先要讲的是如何利用正则去重复,例如有一串字符串'122345333',如何去其中的重复元素? var str='122345333'; while((str!=(str=str.replace( ...
- js给对象添加变量属性 js 更改对象中的属性名 数组对象中每个对象添加一个字段-map用法和forEarch用法
js给对象添加变量属性 & js 更改对象中的属性名 & 数组对象中每个对象添加一个字段-map用法和forEarch用法 1.js给对象添加变量属性 1.js创建一个对象或者在原有对 ...
- 使用 ale.js 制作一个小而美的表格编辑器(4)
今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...
- 如何用 Node.js 实现一个简单的 Websocket 服务?
最近正在研究 Websocket 相关的知识,想着如何能自己实现 Websocket 协议.到网上搜罗了一番资料后用 Node.js 实现该协议,倒也没有想象中那么复杂,除去注释语句和 console ...
- 如何使用 JS 实现一个本地数据库?
本文来自作者 郭方超 在 GitChat 上分享 「使用 JS 实现一个本地数据库」 编辑 | 杰伦 前端很多时候还是需要保存一些数据的,这里的保存指的是长久的保存.以前的思想是把数据保存在 Cook ...
- 如何用5000行JS撸一个关系型数据库
首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...
- 使用 Vue.js 制作一个简单的调查问卷平台
使用 Vue.js 制作一个简单的调查问卷平台 原文 https://github.com/pramper/Demos/tree/master/Vue-Demos/Questionnaire 主题 ...
- mysql复制一个字段值到另一个字段,MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下...
点击查看MySQL怎么把表中一个字段数据复制到另外一个表的某个字段下具体信息 答:update b set tel =(select mobile from a where a.id=b.aid) 注 ...
最新文章
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
- IEEE CS:2021年的12大技术趋势
- 同时查找数组中最大和最小值
- 自制贴纸图案大全图片_重磅!Supreme x 山本耀司联名Bogo贴纸泄露,发售确认?!...
- Swift-binary search tree
- 数据挖掘算法之决策树算法总结
- 普诺飞思公布发明者社区,启发基于事件视觉技术的创新
- IAR常用快捷键及技巧
- linux 环境变量详解,Linux 环境变量详解及实例
- 解决Zarp报错,成功运行
- 高效编程之hashmap你不看就会忘记的知识点
- 多叉树的深度优先遍历并输出叶子路径
- MSN Messenger协议简介
- C语言 输出螺旋数组
- 2021 Alexa SmartHome Skill 对接(二)配置及服务对接
- Mysql将txt文件导入数据库采坑 load data local infile
- iPhone手机开发
- CAD中插入外部参照字体会变繁体_为什么CAD插入外部参照时有些文字消失了?
- Redux 异步数据流-- thunk中间件源码解析
- 嫁我是你一生的赌注,我怎么忍心让你输
热门文章
- java反射机制详解_Java反射机制详解
- 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》
- 连续子数组的最大和python_连续子数组的最大和
- CAN 总线 之七 BOSCH CAN 位时序 和 同步
- Oracle 原理: 闪回 flashback
- 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
- 百度html删除,百度地图-删除默认版权信息
- Cpp 对象模型探索 / 对象的虚函数表指针的位置
- Linux下getopt()函数的简单使用
- java静态类和非静态类_关于java:静态和非静态内部类的区别?