js基础扫盲 - 数组去重(常用的六种方法)

通过 es6 set 去重

function unique(arr) {
    return Array.from(new Set(arr))
}
console.log(unique([1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], []]))

通过set去重,优点是简单直接,但是 无法对{}和 [] 进行去重

set 数据

set 数据是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

可以将 set 和 数组 互相转换

var set = new Set([1,2,1])
var arr = [...set]
console.log(set)
console.log(arr)

使用filter 去重

思路就是 利用 数组的indexOf返回第一个匹配值,并且返回的是新数组。

// Array.indexOf 兼容到ie8
function unique(arr) {
    return arr.filter((val, idx, self) => {
        return self.indexOf(val) === idx
    })
}

缓存新数组 去重

function unique(arr) {
    var temp = []
    arr.forEach(item => {
        if (temp.indexOf(item) === -1) {
            temp.push(item)
        }
    })
    return temp
}
console.log(unique([1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], []]))

缓存新数组,通过splice 兼容去重

function unique(arr) {
    for (var i = 0; i < arr.length; i++){ for (var j = arr.length; j > i; j--) {
            if (arr[i] == arr[j]) {
                arr.splice(j, 1)
            }
        }
    }
    return arr
}
console.log(unique([1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], []]))

排序后对比相邻数据

这个主要还是处理好 splice 删除时数组会变化的问题

function unique(arr) {
    arr.sort()
    for (var i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == arr[i + 1]) {
            arr.splice(i + 1, 1)
        }
    }
    return arr
}
console.log(unique([1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], []]))
console.log(unique([1,2,"2",4,9,"a","a",2,3,5,6,5]))

通过对象键值对

这里,将 {}和 [] 也过滤掉了,但是出了点问题, obj[[1]] = true,被解析成了类似 obj = {1:true}

function unique(arr) {
    var obj = {}, tempArr = []
    for (var i = 0; i < arr.length; i++) { debugger if (!obj.hasOwnProperty(arr[i])) { obj[arr[i]] = true tempArr.push(arr[i]) } } return tempArr } console.log(unique([[1], [2], [], 1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], [], [1], [2]])) // [1, 2, 4, 33, 3, null, undefined, "", {…}, [1], [2]] 

完善版

function unique(arr) {
    var obj = {}, tempArr = []
    for (var i = 0; i < arr.length; i++) { debugger var key = typeof arr[i] === "object" ? JSON.stringify(arr[i]) : arr[i] if (!obj.hasOwnProperty(key)) { obj[key] = true tempArr.push(arr[i]) } } return tempArr } console.log(unique([[1], [2], [], 1,2,1,4,33,3,2,null, undefined, null, undefined, '', '',{}, {}, [], [], [1], [2]])) console.log(unique([function aa (){console.log(1)}, function () {console.log(2)}])) 

随机浏览