項目須要前端判斷已建列表是否存在重複的數據,通過校驗後再進行下一步。如下爲逐步改良的過程,雖然整個過程並不複雜並且沒什麼技術含量,仍是記錄一下以便他人。前端
最單純的方法固然是直接兩層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