这基本上算是一个老生常谈的问题了,也很基础,面试中问的可能性很大,以下是我总结的一些方法,希望可以帮助到大家。
1、利用ES6中的set数据结构
let arr=[1,2,3,4,1,3,4,5];
//set中的成员具有唯一性,可以利用这一特性来去重
let newArr=[...new Set(arr)]
console.log(newArr) //[1,2,3,4,5]
3、利用indexOf方法
let arr=[1,2,3,4,1,3,4,5];
function unique(arr){
let res=[];
for(let i = 0;i<arr.length;i++){
// 判断新的数组中是否有当前值的下标
if(res.indexOf(arr[i])===-1){
res.push(arr[i])
}
}
return res
}
console.log(unique(arr)) //[1,2,3,4,5]
4、利用filter+indexOf的方法
let arr=[1,2,3,4,1,3,4,5];
function unique(arr){
let res=arr.filter((item,index)=>{
// 判断当前值的下标是否等于自身的下标,如果不相等说明是重复的
return arr.indexOf(item)===index
})
return res
}
console.log(unique(arr)) //[1,2,3,4,5]
5、利用Object键值对
let arr=[1,2,3,4,1,3,4,5];
function unique(arr){
if(!(arr instanceof Array)){
console.log('不是数组')
return false
}
let res=[];
let obj={};
for(let i =0;i<arr.length;i++){
if(!obj[arr[i]]){
res.push(arr[i])
obj[arr[i]]=1
}else{
obj[arr[i]]++
}
}
return res;
}
console.log(unique(arr)) //[1,2,3,4,5]
6、利用reduce方法
let arr=[1,2,3,4,5,1,2,3,4]
function unique(arr){
let res=arr.reduce((previousValue,currentValue)=>{
if(previousValue.indexOf(currentValue)==-1){
previousValue.push(currentValue)
}
return previousValue;
},[])
return res
}
console.log(unique(arr)) //[1,2,3,4,5,]
7、利用includes方法
let arr=[1,2,3,4,5,1,2,3,4]
function unique(arr){
let res=[]
for(var i = 0;i<arr.length;i++){
if(!res.includes(arr[i])){
res.push(arr[i])
}
}
return res
}
console.log(unique(arr)) //[1,2,3,4,5]
这些方法都可以实现数据去重,无非是一些兼容性问题
未完待续...