2

背景

项目需要前端判断已建列表是否存在重复的数据,经过校验后再进行下一步。以下为逐步改良的过程,虽然整个过程并不复杂而且没什么技术含量,还是记录一下以便他人。

最单纯的方法

最单纯的方法当然是直接两层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这个数据结构的特性,往这个上面靠,所以诞生了第三种方案,但是后来又发现兼容性问题,所以最终采用了第四种方案。
整体的思路就是这样,或许知道了某一种优化可以牢记于心,以后直接用,但是如果掌握了优化的思路,就可以面对各种场景思考方案,更活而不是死记。


羊都是我吃的
1.4k 声望2.9k 粉丝

将来的你,一定会感谢现在拼命努力的自己。