面试官:数组去重不同方法的执行效率

125 阅读1分钟

背景

面试中数组去重是一个比较常见的题目(八股文之一),很多时候我们只需要说出有哪些方法,就可以过了,但是很多人应该不会专门去研究不同方法执行的效率如何(功能实现就行了,要什么跑车),下文就看一下不同实现方法的执行效率如何

coding 环节

利用es6的Set的(Set是一个无序且唯一的数据结构)

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

利用map + filter

function unique(arr) {
    const temp = {}
    return arr.filter(item => {
        return temp[typeof item + item] ? false : (temp[typeof item + item] = true)
    })
}

filter + indexOf

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

reduce + indexOf

function unique(arr) {
    return arr.reduce((res, next) => {
        return res.indexOf(next) === -1 ? res.concat(next) : res
    }, [])
}

for循环 + indexOf

function unique(arr) {
    const res = []
    
    for (let i = 0; i < arr.length; i++) {
        const item = arr[i]
        if (res.indexOf(item)) {
            res.push(item)
        }
    }
    
    return res
}

总结

面试的时候千万不要只会es6的Set的方式,也不要只会需要创建额外内存空间for循环的方式。 工作的时候大胆使用es6的Set的方式

注意:测试数组的长度为: 35007

for循环 + indexOf: 2.308ms
利用es6的Set的: 0.339ms
reduce + indexOf: 1.448ms
利用map + filter: 3.022ms
filter + indexOf: 215.152ms

当测试数组长度为:393417 后的数据

for循环 + indexOf: 4.232ms
利用es6的Set的: 3.416ms
reduce + indexOf: 5.635ms
利用map + filter: 20.116ms
filter + indexOf: 3.551s