数组去重在我们的前端的面试过程中经过会遇到,有一些人可能会想到一两种,但是
数据去重的算法真的太多了,下面我们一起来看一下吧。
这个是我总结的几种方法,如果大家有不一样的方法,欢迎讨论交流。
1.利用Set去重
function uniqueArray(arr) {
const newArray = new Array(...new Set(arr));
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray); //[1, 2, 3, 4, 5, 8, 9, 10]
2.利用Map去重
function uniqueArray(arr) {
let map = new Map();
const newArray = arr.filter((item)=>{
return !map.has(item) && map.set(item, 0);
})
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray); //[1, 2, 3, 4, 5, 8, 9, 10]
3.利用数组的indexOf()方法去重
function uniqueArray(arr) {
let map = new Map();
const newArray = [];
for(let i=0,len=arr.length; i<len; i++) {
if(newArray.indexOf(arr[i]) === -1) {
newArray.push(arr[i])
}
}
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
4.利用数组的indexOf()方法去重–第二种方法
function uniqueArray(arr) {
let map = new Map();
const newArray = arr.filter((item,index)=>{
return arr.indexOf(item) === index;
})
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
5.利用数组的es6新增方法includes()
function uniqueArray(arr) {
let map = new Map();
const newArray = [];
for(let i=0,len=arr.length; i<len; i++) {
if(!newArray.includes(arr[i])) {
newArray.push(arr[i])
}
}
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
6.利用双层for循环,然后使用数组的splice()方法去重
function uniqueArray(arr) {
for(let i=0,len=arr.length; i<len; i++) {
for(let j=i+1,jLen=arr.length; j<jLen; j++) {
if(arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
7.利用数组排序相邻去除法
function uniqueArray(arr) {
arr.sort((a, b) =>{
return a -b;
})
const newArray = [];
for(let i=0,len=arr.length; i<len; i++) {
if(arr[i] !== newArray[newArray.length - 1]) {
newArray.push(arr[i])
}
}
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
//const newArray = uniqueArray(arr);
//我们这里对数组进行反转,输出的结果还是一致的
const newArray = uniqueArray(arr.reverse());
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
8.优化数组遍历法
function uniqueArray(arr){
const newArray = [];
for(let i = 0, len = arr.length; i < len; i++) {
for(let j = i + 1; j < len; j++) {
if (arr[i] === arr[j]) {
i = ++i; //跳出本层循环到外层循环的下一次循环
}
}
//里层循环如果没有遍历到相同的值,直接加入新数组
newArray.push(arr[i]);
}
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 4, 5, 2, 3, 9, 10, 8]
9.对象键值法
function uniqueArray(arr){
const newArray = [];
const obj = {};
for(let i = 0, len = arr.length; i < len; i++) {
if(!obj[arr[i]]) {
obj[arr[i]] = arr[i];
newArray.push(arr[i]);
}
}
return newArray;
}
let arr = [1, 2, 2, 3,4, 5, 2, 3, 8, 9, 10, 8];
const newArray = uniqueArray(arr);
console.log(newArray);//[1, 2, 3, 4, 5, 8, 9, 10]
总结
使用了这么多方法去做数组去重,方法1,2,9利用了语言的内置对象
有一些利用了数组的相关方法,我们如果在面试中能想出3-5种方法其实就ok
了,如果有其它的方法,或者写的有不对的地方,欢迎大家留言.