var arr=[1,2,3,2,3,1,3,4,5,3,4,5,6,85,5];
定义一个数组我们可以很明显的发现数组中会有一些重复的数据,进而引出对数组进行去重
为什么需要对数组进行去重?
- 数组去重是面试常见的问题。
- 通过数组去重可以能够看出你对数组方法的掌握。
- 它并不能称之为复杂的问题,但是面试官可以看出你的广度和深度,考虑问题的全面性。
- 你以为的不一定你以为,面试官不只是让你去重一个数组,他想知道的有点多,包括你的思想。
1.for循环去重
//分两种情况
//1.数组中对象去重2.数组元素去重
var arr=[1,2,3,2,3,1,3,4,5,3,4,5,6,85,5];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;){
if(arr[i]===arr[j]) arr.splice(j,1);
else j++;//这里是因为splice删除了一位元素,后面的要上去补位
}
}
//对象去重
var arr=[
{id:1,name:"cc1",price:10};
{id:2,name:"cc2",price:20};
{id:1,name:"cc1",price:10};
{id:3,name:"cc3",price:30};
{id:4,name:"cc4",price:40};
{id:1,name:"cc1",price:10};
{id:4,name:"cc4",price:40};
]
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;){
if(arr[i].id===arr[j].id) arr.splice(j,1);
else j++;//这里是因为splice删除了一位元素,后面的要上去补位
}
}
2.for循环之加入新数组
var arr1=[];
for(var i=0;i<arr.length;i++){
var bool=true;
for(var j=0;j<arr1.length;j++){
if(arr[i]===arr1[j]){
bool=false;
break;
}
}
if(bool){
arr1.push(arr[i]);
}
}
//2
var arr1=[];
77: for(var i=0;i<arr.length;i++){
for(var j=0;j<arr1.length;j++){
if(arr[i]===arr1[j]) continue 77;
}
arr1.push(arr[i]);
}
3.includes
//3 includes
var arr1=[];
for(var i=0;i<arr.length;i++){
if(!arr1.includes(arr[i])) arr1.push(arr[i]);
}
4.indexof
//4 indexof
var arr1=[];
for(var i=0;i<arr.length;i++){
if(!arr1.indexof(arr[i])<0) arr1.push(arr[i]);
}
5.reduce
//5 reduce
var arr1=arr.reduce(function(initValue,item){
if(!initValue.includes(t)) initValue(t);
},[]);
6.sort
//6 sort
function newArrfn(arr){
arr=arr.sort;
let newArr=[];
for(let i=0;i<arr.length;i++){
arr[i]===arr[i-1] ? newArr :newArr.push(arr[i]);
}
return newArr;
}
//主要的思路就是对数组进行排序过后,对原数组遍历过程中判断前后两个数是否相等,如果不相等就把数据通过push方法追加到新数组当中
7.ES6 set 特性
function newArrfn(arr)=>return ([...new set(arr)]);
8.ES6 set+Array.from
function newArrfn(arr)=>return (Array.from(new set(arr)) );
9.ES6Map对象+filter
function newArrfn(arr)=>{
const res= new Map();
return arr.filter((a)=>!res.has(a) && res.set(a,1));
}
10.利用对象中属性名不重复特性
function newArrFn (arr) {
// 利用对象属性名不能重复这一特点
// 如果对象中不存在,就可以给 push 进去
let newArr = []
let obj = {}
for(let i = 0;i<arr.length;i++){
if (!obj[arr[i]]) {
newArr.push(arr[i])
obj[arr[i]] =1;
} else {
obj[arr[i]] ++;
}
};
return newArr;
}
注:任何脱离场景谈技术都是妄谈,本文也一样。去重这道题,没有正确答案,可以根据场景去选择一些比较合适的去重方法。
友情提示:不要在forEach map filter reduce every some find findIndex falt 这种回调函数中使用删除和添加原数组 会改变运行过程!