项目须要前端判断已建列表是否存在重复的数据,通过校验后再进行下一步。如下为逐步改良的过程,虽然整个过程并不复杂并且没什么技术含量,仍是记录一下以便他人。前端
最单纯的方法固然是直接两层for循环判断,可是若是当数据量大的时候,计算量也将指数上涨,因此很是很差,果断抛弃。算法
这种思路主要是拿到数据以后先封装到数组中,而后对数组进行一次排序,而后从头至尾遍历看本身的后一个是否相同便可,若是相同,直接返回。这种方法多出了一次对实际业务没有用处的排序操做,也有些缺陷。数组
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这个数据结构的特性,往这个上面靠,因此诞生了第三种方案,可是后来又发现兼容性问题,因此最终采用了第四种方案。
总体的思路就是这样,或许知道了某一种优化能够牢记于心,之后直接用,可是若是掌握了优化的思路,就能够面对各类场景思考方案,更活而不是死记。code