概要
在现实应用中,我们常常需要从页面抓取出一些数据进行二次处理。在抓取出来的数据中,常常包含大量的重复数据,需要去掉重复数据。
本文介绍几种方式来去掉字符串中的重复内容。
解决方案
解决方案
解决方案1,基于ES6的新特新, 例如Set,展开运算符等。
现在要去掉字符串aaabbbcccddd的重复项。代码如下:
var str = [... new Set("aaabbbcccddd")].join("")
运行结果是: abcd
该方法主要是通过将字符串转为Set,而Set这种数据结构不允许有重复项,会自动去掉重复项。然后通过展开运算符将Set转为数组,再通过join方法将数组转为字符串。
解决方案2,我们使用ES5万能的reduce函数实现
var dic = {};
"aaabbbcccddd"
.split("")
.reduce(function(total,next){
if (!(next in dic)){
dic[next] = true;
total += next;
}
return total;
},"")
该方法思路与ES6的解决方案类似。因为JS对象中的key值不能重复,所以可以基于此,过滤掉重复的字符。
以上两种解决方法都是基于某些已有的数据结构不能包含重复项的方式,过滤掉重复字符。
该思路存在一个问题。如果目标字符串是aaabbbcccdddc,并且现在的需求是删除掉连续重复的字符。如果使用上述方法,得到的结果是abcd最后一个字符c丢掉了。
基于上述问题,我们提出解决方案3。解决方案3基于正则表达式。代码如下:
var str = "aaabbbcccdddc".replace(/([\w\W])\1+/g, function(items){return items[0]})
运行结果是: abcdc
该方法思路是:
- [\w\W]表示任意一个字符
- ( )表示包含任意字符的元组
- \1表示元组的引用
- ([\w\W])\1+表示任意两个或多个连续相同的字符,需要按照最长匹配,支持贪婪模式
- /g表示全局匹配
如果大家觉得上述方法\w\W不好记忆,可以使用dotisAll模式。
var str = "aaabbbcccdddc".replace(/(.)\1+/gs, function(items){return items[0]})
总结
个人认为方法3基于正则表达式的方式,可以适用更加复杂的场景,低版本浏览器兼容性也更好。