当前位置: 首页 > Web前端 > JavaScript

【跟大佬学JavaScript】数组去重(结果对比)

时间:2023-03-26 22:55:46 JavaScript

前言数组去重是面试和工作中比较容易看到的问题。本文主要是测试多种方法,分析讨论以下数组的去重结果。如果有不对的地方,请指出。constarr=[1,1,"1","1",0,0,"0","0",true,false,"true","false","a","A",undefined,undefined,"undefined",null,null,'null',NaN,NaN,+0,-0,newString("1"),newString("1"),Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]];特殊类型console.log(1=="1");//trueconsole.log(1==="1");//falseconsole.log(0=="0");//trueconsole.log(0==="0");//falseconsole.log(0==+0);//trueconsole.log(0===+0);//trueconsole.log(0==-0);//trueconsole.log(0===-0);//trueconsole.log(+0==-0);//trueconsole.log(+0===-0);//trueconsole.log(0==false);//trueconsole.log(0===false);//falseconsole.log(0==undefined);//falseconsole.log(0===undefined);//falseconsole.log(0==null);//falseconsole.log(0===null);//falseconsole.log(1==true);//trueconsole.log(1===true);//falseconsole.log(undefined==null);//trueconsole.log(undefined===null);//falseconsole.log(NaN==NaN);//falseconsole.log(NaN===NaN);//falseconsole.log(newString("1")==newString("1"));//falseconsole.log(newString("1")===newString("1"));//falseObject.prototype.toString.call(newString('1'))//'[objectString]'console.log(/a/==/a/);//falseconsole.log(/a/===/a/);//falseObject.prototype.toString.call(/a/);//'[objectRegExp]'console.log(Symbol(1)==Symbol(1));//假控制台。日志(符号(1)===符号(1));//falseconsole.log({}=={});//falseconsole.log({}==={});//falseconsole.log([]==[]);//falseconsole.log([]===[]);//false接下来我们看下面的多种去重方式,以上特殊类型的去重效果代码1(暴力解)//暴力解1functionunique(array){if(!Array.isArray(array)){console.log("类型错误!");返回;}constres=[数组[0]];让arrLen=array.length;让resLen=res.length;for(leti=0;i{if(!Array.isArray(array)){console.log('typeerror!')return}return[...newSet(arr)]}//ES6Map+ES5filter方法四functionunique3(array){if(!Array.isArray(array)){console.log('typeerror!')return}constseen=newMap()returnarray.filter((a)=>!seen.has(a)&&seen.set(a,1))}输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'},String{'1'},Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]]输出说明:去重+0,-0,0去重NaNobjectnewString("1"),/a/,{}不去重array[]不去重Symbol(1)不去重新数组是否存在functionunique(array){if(!Array.isArray(array)){console.log('typeerror!')返回}constnewArr=[];array.forEach((el)=>{if(newArr.indexOf(el)===-1){newArr.push(el);}});returnnewArr;}输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,NaN,String{'1'},String{'1'},Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]]输出结果说明:去重+0,-0,0NaN不去重objectnewString("1"),/a/,{}无重复数组[]无重复符号(1)无重复代码4(indexOf+filter)使用indexOf检测元素在数组中第一次出现的位置是否等于元素的当前位置//indexOf+forEach使用indexOf检测新数组中是否存在元素functionunique(array){if(!Array.isArray(array)){console.log('typeerror!')return}returnarray.filter((item,index)=>{returnarray.indexOf(item)===index;});}console.log([NaN].indexOf(NaN));//-1输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',String{'1'},String{'1'},Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]]输出结果说明:去重+0、-0、0和两个NaN将被删除ObjectsnewString("1"),/a/,{}不去重数组[]不去重Symbol(1)不删除重点:console.log([NaN].indexOf(NaN));//-1代码五(sort排序,不支持Symbol)sort()方法主要用于对数组进行排序,默认方法是将数组元素转换成字符串,然后按照ASC码进行排序//sort()方法不支持Symbol,Symbol不支持转换成字符串functionunique(array){if(!Array.isArray(array)){console.log("输入错误!");返回;}constsortArr=array.sort();constnewArr=[];sortArr.forEach((el,i)=>{if(sortArr[i]!==sortArr[i-1]){newArr.push(el);}});returnnewArr;}输出:[[],[],/a/,/a/,0,"0",0,1,"1",String{'1'},String{'1'},"A",NaN,NaN,{},{},"a",false,"false",null,"null",true,"true","undefined",undefined]输出说明:+0,-0,0,"0"位置不同会导致去重。NaN不会被去重。ObjectsnewString("1"),/a/,{}不会被去重。[]不去重sort()方法不支持处理包含符号码6的数组(includes)使用includes()方法检查新数组是否包含原数组的每一项//使用includes()方法检查新数组是否包含原数组的每一项functionunique(array){if(!Array.isArray(array)){console.log("typeerror!");返回;}constnewArr=[];array.forEach((el)=>{newArr.includes(el)?newArr:newArr.push(el);});returnnewArr;}输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'},String{'1'},Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]]输出说明:deduplication+0,-0,0deduplicationNaNobjectnewString("1"),/a/,{}notDeduplicationarray[]NodeduplicationSymbolNodeduplicationCode7(includes+reduce)使用includes()方法检查新数组是否包含原数组的每一项//使用includes()方法检查新数组是否包含原数组的每一项functionunique(array){if(!Array.isArray(array)){console.log("输入错误!");返回;}returnarray.reduce((pre,cur)=>{!pre.includes(cur)&&pre.push(cur);返回前;},[]);}输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,字符串{'1'},字符串{'1'},符号(1),符号(1),{},{},/a/,/a/,[],[]]输出说明:去重+0,-0,0去重NaNobjectnewString("1"),/a/,{}不去重数组[]不去重Symbol不去重Code8(objectkey)使用属性对象的key不能重复去重//利用对象的key不能重复的特性去重functionunique(array){if(!Array.isArray(array)){console.log("type错误!”);返回;}常量对象={};constnewArr=[];array.forEach((val)=>{if(!obj[typeofval+JSON.stringify(val)]){//将对象序列化为key使用obj[typeofval+JSON.stringify(val)]=1;newArr.push(val);}});returnnewArr;}输出:[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'},Symbol(1),{},[]]输出说明:去重+0,-0,0去重NaN去重对象newString("1"),{};两个/a/全部删除DeduplicationArray[]DeduplicationSymbol对不应该去重的Symbol进行去重;删除两者/a/循环暴力解决方案的摘要方法结果描述[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,NaN,字符串{'1'},字符串{'1'},符号(1),符号(1),{},{},/a/,/a/,[],[]]1。去重+0,-0,0;2.NaN不去重;3.ObjectsnewString("1"),/a/,{}没有去重;4.Array[]没有去重;5.Symbol(1)没有去重;ES6解决方案[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'}、字符串{'1'}、符号(1)、符号(1)、{}、{}、/a/、/a/、[]、[]1。去除权重+0,-0,0;2.去除权重NaN;3.ObjectsnewString("1"),/a/,{}没有去重;4.Array[]没有去重;5.Symbol(1)没有去重;indexOf+forEach[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,NaN,String{'1'},String{'1'},Symbol(1),Symbol(1),{},{},/a/,/a/,[],[]]1.去重+0,-0,0;2.NaN不是3.对象newString("1"),/a/,{}没有去重;4.Array[]没有去重;5.Symbol(1)没有去重;indexOf+filter[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',St环{'1'},字符串{'1'},符号(1),符号(1),{},{},/a/,/a/,[],[]]1。去重+0,-0,0;2.两个NaN都会被删除;3.ObjectsnewString("1"),/a/,{}没有去重;4.Array[]没有去重;5.Symbol(1)不去重;排序不支持Symbol[[],[],/a/,/a/,0,"0",0,1,"1",String{'1'},String{'1'},"A",NaN,NaN,{},{},"a",false,"false",null,"null",true,"true","undefined",undefined]1.+0,-0,0,和“0”是不同的位置,会导致去重失败。2.NaN不会去重;3.ObjectsnewString("1"),/a/,{}不会去重;4.Array[]不会去重。重复数据删除;5.sort()方法不支持处理包含Symbol的数组;包括[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'}、字符串{'1'}、符号(1)、符号(1)、{}、{}、/a/、/a/、[]、[]]1。去重+0,-0,0;2.去重NaN;3.ObjectsnewString("1"),/a/,{}不去重;4.Array[]不去重;5.Symbol(1)不去重;includes+reduce[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,字符串{'1'}、字符串{'1'}、符号(1)、符号(1)、{}、{}、/a/、/a/、[]、[]]1。去重+0,-0,0;2.去重NaN;3.ObjectsnewString("1"),/a/,{}不去重;4.Array[]不去重;5.Symbol(1)不去重;对象键[1,'1',0,'0',true,false,'true','false','a','A',undefined,'undefined',null,'null',NaN,String{'1'}、符号(1)、{}、[]]1。去重+0,-0,0;2.去重NaN;3.去重对象newString("1"),{};两个/a/全部删除;4.去重数组[];5、DeduplicationSymbol以上只是对简单结果的去重总结。我们需要根据自己的业务场景来选择去重方式。demo地址可以在Github仓库查看。向大师学习系列主要是日常了解每个进阶知识点,跟着大师深入了解JavaScript的语言艺术。后续会持续更新,希望各位评委不要吝啬手中的好评。??感谢您的支持!!!??如有错误或不准确的地方,请务必指正,万分感谢!!!??如果你喜欢或启发了什么,欢迎star!!!参考解锁多个JavaScript数组去重姿势数组去重的六种方法实现数组去重的7种方法【JavaScript专题:数组去重】(https://github.com/mqyqingfen...学习JavaScript】数组去重(结果对比)