数组去重最全方法

300 阅读1分钟

1. 利用ES6 Set去重

这种方法无法去掉空对象{}

function unique(arr){
    return Array.from(new Set(arr))
}
var arr = [1,4,5,6,3,4,33,5,{},{}]
console.log(unique(arr)) //[1, 4, 5, 6, 3, 33, {…}, {…}]

简单写法
[...new Set(arr)]

2. 利用for嵌套for,然后用splice去重

NaN,{}不能去重

function unique(arr){
    for(var i = 0; i < arr.length; i++){
        for(var j = i+1, j < arr.length; j++){
            if(arr[i] == arr[j]){
                arr.splice(j,1)
                j--
            }
        }
    }
    return arr
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) //[1, 4, 5, 6, 3, 33, {…}, {…},NaN, NaN]

3. 利用indexOf

NaN,{}不能去重

function unique(arr){
    if(!Array.isArray(arr)){
        return false
    }
    var array = []
    for(var i = 0; i<arr.length; i++){
        if(array.indexOf(arr[i]) === -1){
            array.push(arr[i])
        }
    }
    return array
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) //[1, 4, 5, 6, 3, 33, {…}, {…},NaN, NaN]

4. 利用sort

NaN,{}不能去重

function unique(arr){
    if(!Array.isArray(arr)){
        return false
    }
    arr = arr.sort()
    var array = [arr[0]]
    for(var i = 1; i < arr.length; i++){
        if(arr[i] !== arr[i-1]){
            array.push(arr[i])
        }
    }
    return array
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) //[1, 4, 5, 6, 3, 33, {…}, {…},NaN, NaN]

5. 利用includes

空对象无法去重

function unique(arr){
    if(!Array.isArray(arr)){
        return false
    }
    var array = []
    for(var i = 0; i<arr.length; i++){
        if(!array.includes(arr[i])){
            array.push(arr[i])
        }
    }
    return array
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) 

6. 利用hasOwnProperty

这种方法可以全部去重

function unique(arr){
    var obj = {}
    return arr.fliter((item,index,arr) => {
        return obj.hasOwnProperty(typeof item + item) ? fasle : (obj[typeof item+item] = true) 
    })
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) 

7. 利用filter

这种方法不能去除空对象

function unique(arr){
    return arr.filter((item, index, arr) => {
        return arr.indexOf(item,0) === index
    ])
}
var arr = [1,4,5,6,3,4,33,5,{},{},NaN, NaN]
console.log(unique(arr)) 

8. 利用Map数据结构

这种方法无法去除空对象

function unique(arr){
    let map = new Map()
    let array = new Array()
    for(let i = 0; i<arr.length; i++){
        if(map.has(arr[i])){
            map.set(arr[i],true)
        }else{
            map.set(arr[i],false)
            array.push(arr[i])
        }
    }
    return array
}