在开发时总会遇到这样的需求,就是不要保存重复的数据,要不然会造成数据多余,内存浪费。所以要去重
1、ES6的Set
基本思路:利用Set对象的去重
function unique(arr){
// return Array.from(new Set(arr))
return [...new Set(arr)];
}
2、filter过滤
基本思路:利用filter对数组进行过滤,过滤条件就是第一次出现的值和它的索引相对应。第二次出现该值时,arr.indexOf(item)
还是第一次的index
,所以去除掉。
function unique1(arr){
return arr.filter((item,index)=>{
return arr.indexOf(item) === index
})
}
3、后移去重法
基本思路:还是利用了indexOf
,判断条件和上一个方法差不多,就把重复的值移动的后面,然后截取数组。
function unique2(arr){
let right = arr.length - 1;
for(let i=0;i<arr.length;i++){
if(right <= i){
break;
}
if(arr.indexOf(arr[i]) !== i){
[arr[i],arr[right]] = [arr[right],arr[i]]
right--;
i--;
}
}
return arr.slice(0,right)
}
4、reduce去重法
基本思路:利用了indexOf
,初始值为一个空数组,如果该空数组已有当前值cur
则不添加进空数组,否则添加进去。
function unique3(arr){
return arr.reduce((pre,cur)=>{
if(pre.indexOf(cur) === -1){
pre.push(cur)
}
return pre;
},[])
}
5、sort排序去重法
基本思路:先排序,后判断,然后相邻两个值不相等则添加进新数组,否则不添加。
function unique4(arr){
arr.sort();
let newArray = [];
for(let i =0;i<arr.length;i++){
if(arr[i] !== arr[i+1]){
newArray.push(arr[i])
}
}
return newArray;
}
6、includes去重法
基本思路:利用了数组的includes
方法,新建一个空数组,然后该空数组不包含当前值item
则添加进去,否则不添加
function unique5(arr){
let newArray = [];
arr.forEach((item)=>{
if(!newArray.includes(item)){
newArray.push(item)
}
})
return newArray;
}
7、Map去重法
基本思路:利用了Map对象的键值不重复,也就是拿一个对象来保存已有数据,然后判断是否已有该键值,有则跳过;否则添加,然后把数值push进一个数组中。
function unique6(arr){
let newArray = [];
let tmp = new Map()
for(let i=0;i<arr.length;i++){
if(!tmp.get(arr[i])){
tmp.set(arr[i],1)
newArray.push(arr[i])
}
}
return newArray
}
数组去重方法很多,还需慢慢探索。