数组去重的 8 种方法

236 阅读1分钟

法1 双重 for 循环 + 开关思想

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
let newArr = []
for (let i = 0; i < arr.length; i++) {
    let flag = true
    for (let j = 0; j < newArr.length; j++) {
        if (arr[i] === newArr[j]) {
            flag = false
            break
        }
    }
    if (flag) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

法2 双重 for 循环 + splice()

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
function uniqueArr(arr) {
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] === arr[j]) {
                arr.splice(j, 1)
                j--
            }
        }
    }
    return arr
}
console.log(uniqueArr(arr))

法3 indexOf() + for 循环

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
let newArr = []
for (let i = 0; i < arr.length; i++) {
    // -1 表示 arr 的元素不在 newArr 中
    if (newArr.indexOf(arr[i]) === -1) {
        newArr.push(arr[i])
    }
}
console.log(newArr)

法4 indexOf() + filter()

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
function uniqueArr(arr) {
    return arr.filter((item, index) => {
        return arr.indexOf(item) === index
    })
}
console.log(uniqueArr(arr))

法5 展开运算符 + new Set()

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
let newArr = [...new Set(arr)]
console.log(newArr)

法6 forEach循环 + new Set()

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
let dataSet = new Set()
let resSet = []
arr.forEach(item => {
    if (!dataSet.has(item)) {
        resSet.push(item)
    }
    dataSet.add(item)
})
console.log(resSet);

法7 利用 Map() 数据结构去重

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
let unique = (arr) => {
    let seen = new Map()
    return arr.filter((item) => {
        return !seen.has(item) && seen.set(item, 1)
    })
}
console.log(unique(arr))

法8 利用 reduce() + includes() 去重

let arr = [10, 20, 50, 10, 80, 20, 60, 40, 71, 18, 30, 30]
function unique(array) {
    return array.reduce((prev, next) => {
        return prev.includes(next) ? prev : [...prev, next]
    }, [])
}
console.log(unique(arr))