数组去重的题目在面试中属于高频题目,因此在这里记录一下几种实现方式:
方式一:Array.from()
function unique(arr) {
return Array.from(new Set(arr))
}
方式二:扩展运算符
function unique(arr) {
return [...new Set(arr)]
}
方式三:双重循环
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 unqiue(arr) {
let res = []
for(let i = 0; i < arr.length; i++) {
if(res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}
方式五:filter()
function unqiue(arr) {
let res = arr.filter((item, index, array) => {
return array.indexOf(item) === index
})
return res
}
方式六:利用对象key的唯一性
function unique(arr) {
let obj = {}
for(let i = 0; i < arr.length; i++) {
let item = arr[i]
if(obj[item] !== undefined) {
arr.splice(i, 1)
i--
continue
}
obj[item] = item
}
return arr
}
方式七:交换元素位置,替换splice()
使用splice()
有一定的性能问题,当前项被删除后,后面的每一项都要向前移动一位,数据量大时会影响性能。采用交换元素的方式,效率会高一点。思路是若当前元素重复,则与数组的最后一位元素交换,同时i--
,length--
。
function unique(arr) {
let obj = {}
for(let i = 0; i < arr.length; i++) {
let item = arr[i]
if(obj[item] !== undefined) {
arr[i] = arr[arr.length - 1]
i--
arr.length--
continue
}
obj[item] = item
}
return arr
}