在程序中,通常解决一个问题的方法有很多种。当然这些不同思路的解决方法,在性能和效率上也有很大差异。
以下是数字去重的三种方法,
一、循环遍历法(传统思路)
最简单粗暴的算法,新建一个空数组,然后遍历原数组,将不在新数组中的项添加到新数组,最后返回新数组
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;//返回新数组 }