1.set去重(ES6最常用)
- 优点:代码少
- 缺点: 1.不能排除空对象{}
function unique(array){
return Array.from(new Set(array))
}
const arr= [1,5,2,3,4,2,3,1,3,4]
console.log(unique(arr))
2.用两个for循环嵌套,然后splice去重(ES5中最常用)
- 缺点:NaN和空对象{}不能排除
function unique(array){
for (let i = 0; i<array.length; i++){
for (let j = i+1; j<array.length; j++){
if (array[i] === array[j]){
array.splice(j,1)
j--
}
}
}
return array
}
const arr= [1,5,2,3,4,2,3,1,3,4]
console.log(unique(arr))
3.利用indexOf去重
- 缺点:NaN和空对象{}不能排除
//创建一个空数组,for循环遍历原数组结果数组中是否有当前遍历出来的元素,如果相同就跳过,如果不相同就push到数组中
function unique(array){
if (!Array.isArray(array)){
console.log('type error')
return
}
const arr = []
for (let i = 0;i<array.length; i++){
if (arr .indexOf(array[i]) === -1) {
arr .push(array[i])
}
}
return arr
}
const arr= [1,5,2,3,4,2,3,1,3,4]
console.log(unique(arr))
4.根据sort方法
缺点:不能排除空对象和NaN
//用sort()对数组进行排序,然后遍历排序后的数组,对比相邻的两个元素,如果不相等则将数据push到空数组中
function unique(array){
if (!Array.isArray(array)){
console.log('type error')
return
}
array = array.sort()
let arr = [array[0]]
for (let i = 0; i<array.length; i++){
if (array[i] !== array[i-1]){
arr.push(array[i])
}
}
return arr
}
const arr= [1,5,2,3,4,2,3,1,3,4]
console.log(unique(arr))
5.filter方法
- 缺点:NaN消失了,空对象{}不能去重
function unique(array){
return array.filter((item,index,array) =>{
return array.indexOf(item,0) === index
})
}
const arr= [1,5,2,3,4,2,3,1,3,4,]
console.log(unique(arr))
6.使用Map方法
- 空对象不能去重
function unique(array){
let hasMap = new Map()
let arr = new Array()
for (let i = 0; i<array.length; i++){
if (hasMap.has(array[i])){
hasMap.set(array[i],true)
}else {
hasMap.set(array[i],false)
arr.push(array[i])
}
}
return arr
}
const arr= [null,null,1,5,2,3,4,2,3,1,3,4,NaN,NaN,{},{},undefined,undefined]
console.log(unique(arr))