前端常用面试算法题--数组去重

数组去重在我们的前端的面试过程中经过会遇到,有一些人可能会想到一两种,但是
数据去重的算法真的太多了,下面我们一起来看一下吧。
这个是我总结的几种方法,如果大家有不一样的方法,欢迎讨论交流。

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
了,如果有其它的方法,或者写的有不对的地方,欢迎大家留言.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值