情况1: 纯数组
- 一句话去重
var a = [2,2,2,2,4]
[...new Set(a)] // [2,4]
- indexof || includes || new Set()
function unip1(arr){
let res = [];
for(var i=0;i<arr.length;i++){
if(!res.includes(arr[i])){
res.push(arr[i])
}
}
return res
}
unip1([2,2,3,4,4])
情况2: 如果数组内是对象列表,👆的方法就不可行了
- 一些常规for循环方法 indexOf,includes,new Set()等
function unip2(arr){
let res = [];
let temp= new Set();
for(var i=0;i<arr.length;i++){
let current = arr[i];
if(!temp.has(current.type)){
res.push(current)
temp.add(current.type)
}
}
return res
}
var a = [{type:2},{type:3},{type:2}]
unip2(a)
function unip3(arr){
let res = [];
let temp= {};
for(var i=0;i<arr.length;i++){
let current = arr[i];
if(!temp[current.type]){
res.push(current)
temp[current.type]=true;
}
}
return res
}
var a = [{type:2},{type:3},{type:2}]
unip3(a)
- 可以累加器去重
var a = [{type:2},{type:3},{type:2}]
let hash = {}
a.reduce((preVal,curVal)=>{
hash[curVal.type] ? '' : hash[curVal.type]=true && preVal.push(curVal)
return preVal
},[])
总结:
去重的一个原理就是:
- 开辟一个空间res,把结果放进去
- 有一个对象变量,对象中放置对象要去重的key
- 如果对象中没有这个key就 push 到新开辟的res数组中