背景
项目需要前端判断已建列表是否存在重复的数据,经过校验后再进行下一步。以下为逐步改良的过程,虽然整个过程并不复杂而且没什么技术含量,还是记录一下以便他人。
最单纯的方法
最单纯的方法当然是直接两层for循环判断,但是如果当数据量大的时候,计算量也将指数上涨,所以非常不好,果断抛弃。
排序后查重
这种思路主要是拿到数据之后先封装到数组中,然后对数组进行一次排序,然后从头到尾遍历看自己的后一个是否相同即可,如果相同,直接返回。这种方法多出了一次对实际业务没有用处的排序操作,也有些缺陷。
利用Set的特性
Set的特性是不重复,所以思考可以利用这一点进行比对。整体思路是将数组中的数据放入Set中,然后比较Set和原数组的长度,如果不一致,那么说明存在重复的数据。
代码如下:
var sourceArray = [1,2,3,4,5];
var tempSet = new Set();
for(i = 0;i<sourceArray.length;i++){
tempSet.add(sourceArray[i]);
}
if(sourceArray.length != tempSet.size){
alert("repeat");
}
就在我美滋滋的已经把算法实现到我们项目的时候,前端的妹子告诉我Set的兼容性存在问题,所以不得不抛弃了这个想法,进入了下一步的优化。
位图的思想
这个标题是我根据位图排序的思想起的名字,(位图排序是一种很好玩的排序思路,有兴趣可以百度)。这种优化的主要思路是设置了一个标志位的数组,如果存在则对应位置为true。如果某一个数据发现自己的位置已经是true了,那么说明存在重复的数据了。
代码如下:
var sourceArray = [1,2,3,4,5,4,5];
var flagArray = new Array();
for(i = 0;i<sourceArray.length;i++){
if(flagArray[sourceArray[i]]){
alert("repeat");
}
flagArray[sourceArray[i]] = true;
}
思路的发展
开始动手的时候已经知道两层循环是不行的,所以一定不会采取这种方式,然后想到的是是否已经存在重复的轮子,也就是说,有没有函数能直接判断重复,查了一下好像没有,于是想到了Set这个数据结构的特性,往这个上面靠,所以诞生了第三种方案,但是后来又发现兼容性问题,所以最终采用了第四种方案。
整体的思路就是这样,或许知道了某一种优化可以牢记于心,以后直接用,但是如果掌握了优化的思路,就可以面对各种场景思考方案,更活而不是死记。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。