JS数组去重的三种方法

在程序中,通常解决一个问题的方法有很多种。当然这些不同思路的解决方法,在性能和效率上也有很大差异。

以下是数字去重的三种方法,

 

一、循环遍历法(传统思路)

最简单粗暴的算法,新建一个空数组,然后遍历原数组,将不在新数组中的项添加到新数组,最后返回新数组

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;//返回新数组
}

 

posted @ 2017-05-15 15:21  小古哥  阅读(2975)  评论(0编辑  收藏  举报