js之数组去重

136 阅读1分钟

方法一:双重 for + splice

function unique(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
}

方法二:indexOf

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

方法三:includes

function unique(arr) {
    var uniqueArr = []

    for(let i=0; i<arr.length; i++) {
        if (!uniqueArr.includes(arr[i])) {
            uniqueArr.push(arr[i])
        }
    }
    return uniqueArr
}

方法四:sort + 快慢指针

function unique(arr) {
    arr.sort((a, b) => a - b)
    let fast = 1,
    slow = 1

    while(fast < arr.length) {
        if (arr[fast] !== arr[fast - 1]) {
            arr[slow++] = arr[fast]
        }
        ++ fast
    }

    arr.length = slow
    return arr
}

方法五:Set

function unique(arr) {
    return [...new Set(arr)]
}

方法六:Hash

function unique(arr) {
    let map = new Map()
    let uniqueArr = new Array()

    for (let i=0; i<arr.length; i++) {
        if (!map.has(arr[i])) {
            map.set(arr[i], true)
            uniqueArr.push(arr[i])
        }
    }
    return uniqueArr
}

方法七:filter + indexOf

function unique(arr) {
    return arr.filter((item, index, arr) => {
        return arr.indexOf(item) === index
    })
}

方法八:reduce + includes

function unique(arr) {
    return arr.reduce((acc, cur) => {
        if (!acc.includes(cur)) {
            acc.push(cur)
        }
        return acc
    }, [])
}