对let arr = [false,false,'uu盘','uu盘',2,2,undefined,undefined,null,null,NaN,NaN,{},{}]
进行去重。
1. ES6-set
使用ES6中的set方法
let newArr = [...new Set(arr)]
console.log(newArr);
只能对简单数据类型进行去重,引用数据不能去重
2. forEach + indexOf
let newArr = []
arr.forEach(item=>{
if(newArr.indexOf(item) == -1) {
newArr.push(item)
}
})
console.log(newArr);
使用forEach+indexOf,不能对NaN进行去重,可以使用includes方法arr.indexOf(NaN) === -1
3. filter + indexOf
let newArr = arr.filter((val,index,item)=>{
return item.indexOf(val) == index
})
console.log(newArr);
美中不足的是,还是不能对NaN去重
4. forEach + includes
let newArr = []
arr.forEach(item=>{
if(!newArr.includes(item)) {
newArr.push(item)
}
})
console.log(newArr);
5. 使用Map数据结构去重
function unique(arr) {
let map = new Map()
let newArr = []
arr.forEach((item,index)=>{
if(map.has(item)) { // 如果存在key值
map.set(item,true)
} else {
map.set(item,false)
newArr.push(item)
}
})
return newArr
}
console.log(unique(arr));
6. 终极版本
前面几种方法是不能对引用数据类型进行去重
function arr_unique(arr){
var hash = {};
return arr.filter((val)=>{
return hash.hasOwnProperty( typeof val + JSON.stringify(val) ) ? false : hash[typeof val + JSON.stringify(val)] = true ;
});
}
console.log(arr_unique(arr));
7. 根据对象的某个属性去重
// 数据:
let list = [{
id:'1',
name:'one'
},{
id:'2',
name:'tow',
},{
id:'3',
name:'three'
},{
id:'1',
name:'one'
},{
id:'2',
name:'tow',
},{
id:'4',
name:'three'
}]
function unique(arr,val) {
const res = new Map();
// 返回不存在这个属性
return arr.filter(item => !res.has(item[val]) && res.set(item[val], 1))
}
console.log(unique(list,'id'));