当前位置: 首页 > 科技观察

Javascript一共有15种数组去重方法,总有一种适合你

时间:2023-03-13 17:04:23 科技观察

数组去重,面试中经常会遇到,通常需要手写数组去重方法的代码。如果有人问你,数组去重的方法有哪些?如果你能回答其中的10个,面试官很可能会对你刮目相看。实际项目中遇到的数组去重,一般都是在后台处理,前端处理的很少。虽然在日常项目中用到的概率比较低,但还是要了解一下,以防面试时被问到。一、数组去重1、使用ES6Set去重(ES6中最常用),不考虑兼容性。这种去重方法代码最少。该方法无法去除“{}”空对象,后期高阶方法会增加去除重复“{}”的方法。functionunique(arr){returnArray.from(newSet(arr))}vararr=[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];console.log(unique(arr))//[1,"true",true,15,false,undefined,null,NaN,"NaN",0,"a",{},{}]//简化了上面代码[...newSet(arr)]2.用for嵌套for,再拼接去重(ES5中最常用的)双层循环,外层循环元素,内层循环比较值。如果值相同,则删除该值。functionunique(arr){for(vari=0;i=1){if(array[index]===array[index-1]){array.splice(index,1);}loop(index-1);//递归循环,然后数组去重}}loop(len-1);returnarray;}vararr=[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];console.log(unique(arr))//[1,"a","true",true,15,false,1,{...},null,NaN,NaN,"NaN",0,"a“,{...},未定义]9。使用Map数据结构去重创建一个空的Map数据结构,遍历需要去重的数组,将数组的每个元素作为键存入Map中,因为相同的键值不会出现在Map中,所以最后的结果就是去重后的结果。functionarrayNonRepeatfy(arr){letmap=newMap();//数组用于返回结果letarray=newArray();for(leti=0;iprev.includes(cur)?prev:[...prev,cur],[]);}vararr=[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];console.log(unique(arr));//[1,"true",true,15,false,undefined,null,NaN,"NaN",0,"a",{…},{…}]2.数组对象去重使用数组中对象的某个key作为唯一标识,如果相同则删除constarr=[{name:'SwiftScout',id:0},{name:'GeorwindSwordsman',id:1},{name:'Malphite',id:2},{name:'诡诈妖精',id:3},{name:'风暴剑客',id:1},{name:'迅捷斥候',id:0},{name:'狂暴Lolita',id:4},]1.Doubleforloopfunctionunique(arr){for(leti=0;i{obj[item.id]?'':obj[item.id]=true&&data.push(item)returndata;},[])returnarr}3.Map()has方法可以判断Map对象中是否存在指定元素,存在则返回true,否则返回假;set方法可以向Map对象添加新元素map.set(key,value);values方法可以返回Map对象值的遍历器对象函数unique(arr){letmap=newMap()for(letiofarr){if(!map.has(i.id)){map.set(i.id,i)}}arr=[...map.values()]returnarr}4.for循环函数unique(arr){letnewArr=[];letobj={};for(vari=0;i{letistrue=newArr.every((values)=>{returnitem.id!=values.id})istrue?newArr.push(item):''})returnnewArr}