在程序中,通常解決一個問題的方法有很多種。當然這些不同思路的解決方法,在性能和效率上也有很大差異。
以下是數字去重的三種方法,
一、循環遍歷法(傳統思路)
最簡單粗暴的算法,新建一個空數組,然后遍歷原數組,將不在新數組中的項添加到新數組,最后返回新數組
function compare(arr){ var newarr=[];//新建空數組 for(var i=0; i<arr.length;i++){//遍歷原數組 var isadd=true;//設置標記 for(var j=0; j<newarr.length;j++){//遍歷新數組 if(arr[i]===newarr[j]){isadd=false;break;}//如果當前原數組中的項,在新數組中存在,則標記為‘不添加’,並跳出新數組遍歷 } if(isadd){newarr.push(arr[i]);}//若標記為‘添加’(即遍歷新數組后,沒有發現相同項),則添加進新數組 } return newarr;//返回新數組 }
二、排序比較法(巧妙轉換)
相對第一種方法,需要每次遍歷新舊兩個數組,效率不高的情況。此方法先對原數組進行排序,這樣每次只要與新數組的最后一項比較即可,大大提高效率
function sortarr(arr){ var arrsort=arr.sort();//對原數組進行排序 var newarr=[];//新建空數組 newarr.push(arrsort[0]);//將排序后數值的第一項給添加到新數組 for(var i=1;i<arrsort.length;i++){//遍歷排序后的數組 if(arrsort[i]!==newarr[newarr.length-1]){newarr.push(arrsort[i])}//若當前項與新數組最后一項不同,這添加到新數組 } return newarr;//返回新數組 }
三、對象屬性法(另辟新徑)
相對前兩種方法通過比較的方式,此方法主要利用了對象屬性(key值)不可重復的特性,將數組中各項賦值給一個新對象,重復將自動覆蓋。最后從對象上遍歷出屬性即可。
function attribute(arr){ var obj={};//新建空對象 var newarr=[];//新建空數組 for(var i=0; i<arr.length;i++){obj[arr[i]]=null;}//將原數組項作為對象的key進行賦值 for( var attr in obj){newarr.push(Math.floor(attr));}//遍歷對象,取出key值添加到新數組 return newarr;//返回新數組 }