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