数组去重7种算法

60 阅读1分钟

1、遍历 新建一个新数组,对传入的数组遍历,新数组种没有的就添加进去。

function arrayUnique(array){
    var result=[]
    for(var i = 0;i<arr.length;i++){
        if(result.indexOf(array[i])===-1){
            result.push(array[i])
        }
    }
    return result
}

2、利用对象键值对

function arrayUnique2(array){
    var obj={},result={},val,type
    for(var i = 0; i<arr.length; i++){
        val = array[i]
        type = typeof val
        if(!obj[val]){
            obj[val] = [type]
            result.push(val)
        } else if(obj[val].indexOf(type) < 0){
        //判断数据类型是否存在
            obj[val].push(type)
            result.push(val)
        }
    }
    return result
}
        

3、先排序,在去重

function arrayUnique3(array){
    var result = [array[0]]
    array.sort(function(a,b){return a-b})
    for(var i = 0;i < array.length; i++){
        if(array[i]!== result[result.length-1){
        result.push(array[i])
        }
    }
    return result
}

4、优先遍历数组 (双重循环)

function arrayUnique4(array){
    var res=[]
    for(var i=0,l=array.length;i<array.length;i++){
        for(var j=i+1;j<l;j++){
        //依次比较,相同则更改索引
        if(array[i]===array[j]){
        j=++i
        }
    }
    //每轮比较完毕,索引为i的值为数组中只出现一次的值
    res.push(array[i])
}
return res
}
    

5、基于reduce()函数

function arrayUnique5(array){
    var obj={},type
    return array.reduce(function (preValue,curValue){
        type = typeof curValue
        if(!obj[curValue]){
            obj[curValue] = [type]
            preValue.push(curValue)
        }else if(obj[curValue].indexOf(type)<0){
            obj[curValue].push(type)
            preValue.push(curValue)
        }
        retuen preValue
    },[])
}

6、ES6的Set数据结构

function arrayUnique6(array){
    return Array.from(new Set(array))
}

7、ES6的map数据结构 map+filter()

function arrayUnique7(array){
    var map=new Map()
    return array.filter((item)=>!map.has(item)&&map.set(item,1))
}