一、利用嵌套for循环遍历对比
function distinct(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
}
优点:简单粗暴,最容易想到的一种
缺点:无法将{}和NaN去重,因为{}!=={},NaN!==NaN
二、利用indexOf方法
function distinct(arr) {
var newArr=[]
for(let i=0;i<arr.length;i++){
if(newArr.indexOf(arr[i])<0) {
newArr.push(arr[i])
}
}
return newArr
}
优点:相比上一个方法,时间复杂度降低
缺点:同样无法去重{}和NaN,且需要额外存储空间
三、利用includes方法
function distinct(arr) {
var newArr=[]
for(let i=0;i<arr.length;i++){
if(!newArr.includes(arr[i])) {
newArr.push(arr[i])
}
}
return newArr
}
优点:相比前一个方法可以对NaN去重
缺点:还是无法去重{},同样消耗了额外的内存空间
四、利用对象属性key唯一的特性
function distinct(arr) {
var obj={}
for(let i=0;i<arr.length;i++){
if(!obj[arr[i]]) {
obj[arr[i]]=1
arr.splice(i,1)
i--
}
}
return arr
}
目前发现的最完美的方法
五、利用es6的set数据结构
function distinct(arr) {
return Array.from(new Set(arr))
}
优点:代码最简洁
缺点:不能去重{}