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

面试官会问的数组操作

时间:2023-03-26 20:55:14 JavaScript

数组去重数组去重测试数据如下:constsourceArray=[null,6,34,'6',[],'a',undefined,'f','a',[],34,null,{},true,NaN,{},NaN,false,true,undefined]constfilterArray=unique(sourceArray)双循环函数unique(sourceData){letflagletfilterArray=[]for(leti=0;i{returnsourceData.indexOf(item)===index})}//[null,6,34,"6",[],"a",undefined,"f",[],{},true,{},false]注意:sourceData.indexOf(NaN)返回的值永远是-1,index永远不可能是-1,所以过滤掉NaNfunctionunique(sourceData){letfilterArray=[]sourceData.forEach(item=>{//filterArray数组中没有项目if(filterArray.indexOf(item)===-1){filterArray.push(item)}})returnfilterArray}//[null,6,34,"6",[],"a",undefined,"f",[],{},true,NaN,{},NaN,false]排序函数unique(sourceData){letfilterArray=[]sourceData.sort()for(leti=0;i{if(!filterArray.includes(item)){filterArray.push(item)}})returnfilterArray}//[[],[],34,6,"6",NaN,{},{},“a”,“f”,false,null,true,undefined]reducefunctionunique(sourceData=[]){returnsourceData.reduce((pre,cur)=>pre.includes(cur)?pre:[...pre,cur],[])}//[[],[],34,6,"6",NaN,{},{},"a","f",false,null,true,undefined]mapfunctionunique(sourceData){letmap=newMap()//创建一个Map实例returnsourceData.filter(item=>{return!map.has(item)&&map.set(item,1)})}//[[],[],34,6,"6",NaN,{},{},"a","f",false,null,true,undefined]setfunctionunique10(sourceData){return[...newSet(sourceData)]}//[[],[],34,6,"6",NaN,{},{},"a","f",false,null,true,undefined]注:以上方案均为不适用于包含数组和对象等引用数据类型的情况。对象利用对象属性的唯一性去重。functionunique(sourceData){letmap=newMap()//创建一个Map实例letfilterArray=[]for(leti=0;i{Array.isArray(item)?flatArray.concat(flat(item,flatArray)):flatArray.push(item)});returnflatArray}constflatArray=flat(sourceArray,[])//[4,"4","c",6,{...},7,"v","s",6,23,"叹息郁闷”]...+递归函数flat(sourceArray){while(sourceArray.some(item=>Array.isArray(item))){sourceArray=[].concat(...sourceArray);}returnsourceArray;}constflatArray=flat(sourceArray)//[4,"4","c",6,{...},7,"v","s",6,23,"叹息Gu"]reduce+recursivefunctionflat(sourceArray){returnsourceArray.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?flat3(cur):cur),[])}constflatArray=flat(sourceArray)//[4,"4","c",6,{...},7,"v","s",6,23,"叹气郁闷"]flatfunctionflat(sourceArray){/***flat参数说明*Default:flag()数组只展开一层*Number:flat(2)数组展开两层,传入控制展开开放层数;数小于等于0,返回原数组*Infinity:flat(Infinity),展开成一维数组*/returnsourceArray.flat(Infinity)}constflatArray=flat(sourceArray)//[4,"4","c",6,{…},7,"v","s",6,23,《叹息与孤独》]数组并集、数组并集、交集、差集的测试数据为如下:constsourceArray=[48,34,'6',undefined,'f','a',34,true,NaN,false,34,true,'f']constsourceArray2=[52,34,'6',未定义,'s',23,'cf',true,NaN,false,NaN]filter+includesfunctionunion(sourceArray,sourceArray2){constunionArray=sourceArray.concat(sourceArray2.filter(item=>!sourceArray.includes(item)))return[...newSet(unionArray)]}constunionArray=union(sourceArray,sourceArray2)//[48,34,"6",undefined,"f","a",true,NaN,false,52,"s",23,"cf"]setfunctionunion(sourceArray,sourceArray2){return[...newSet([...sourceArray,...sourceArray2])]}constunionArray=union(源数组,源Array2)//[48,34,"6",undefined,"f","a",true,NaN,false,52,"s",23,"cf"]数组交集过滤器+包含函数onintersect(sourceArray,sourceArray2){constintersectArray=sourceArray.filter(item=>sourceArray2.includes(item))return[...newSet(intersectArray)]}constintersectArray=intersect(sourceArray,sourceArray2)//[34,"6",undefined,true,NaN,false]setfunctionintersect(sourceArray,sourceArray2){sourceArray=newSet(sourceArray)sourceArray2=newSet(sourceArray2)常量intersectArray=[...sourceArray].filter(item=>sourceArray2.has(item))return[...newSet(intersectArray)]}constintersectArray=intersect(sourceArray,sourceArray2)//[34,"6",undefined,true,NaN,false]数组差集filter+includesfunctiondifference(sourceArray,sourceArray2){constdifferenceArray=sourceArray.concat(sourceArray2).filter(item=>!sourceArray2.includes(item))返回[...newSet(differenceArray)]}constdifferenceArray=difference(sourceArray,sourceArray2)//[48,"f","a"]setfunctiondifference(sourceArray,sourceArray2){酸ceArray=newSet(sourceArray)sourceArray2=newSet(sourceArray2)constintersectArray=[...sourceArray].filter(item=>!sourceArray2.has(item))返回[...newSet(intersectArray)]}constdifferenceArray=difference(sourceArray,sourceArray2)//[48,"f","a"]数组拆分数组拆分测试数据如下:constsourceArray=[73,343,'g',56,'j',10,32,43,90,'z',9,4,28,'z',58,78,'h']constchunkArray=chunk(sourceArray,4)while+slicefunctionchunk(sourceArray=[],length=1){letchunkArray=[]letindex=0while(index(t[t.length-1].length===size?t.push([v]):t[t.length-1].push(v),t),[[]]):[];}调整后的代码:functionchunk(arr=[],size=1){if(arr.length){arr=arr.reduce((t,v)=>{/***t的初始值为[[]],则t.length为1,所以t[t.length-1]为[],t[t.length-1].length为0,pushv到t[0],此时t=[[73]]*此时t.length还是1,所以t[t.length-1]是[73],t[t.length-1].length为1,将v压入t[0],此时t=[[73,343]]*直到t[0]有四个数据[[73,343,"g",56]]*此时时间,t.length为1,所以t[t.length-1]为[73,343,"g",56],t[t.length-1].length为4,将[v]推入t,此时t=[[73,343,"g",56]['j']],to以此类推*/t[t.length-1].length===size?t.push([v]):t[t.length-1].push(v)returnt},[[]])}returnarr}//[[73,343,"g",56],["j",10,32,43],[90,"z",9,4],[28,"z",58,78],["h"]]数组到对象Object.assignconstsourceArray=['CSSWorld','活着','卡皮talTheory']functiontoObject(所以urceArray){returnObject.assign({},sourceArray)}constresult=toObject(sourceArray)//{0:"CSSWorld",1:"Alive",2:"CapitalTheory"}减少第一个对象形式constbooks=[{name:"CSSWorld",author:"张新旭",price:69,serialNumber:'ISBN:97871151759'},{name:"Alive",author:"余华",price:17.5,serialNumber:'I247.57/105'},{name:"DasKapital",author:"Marx",price:75,serialNumber:'9787010041155'}];functiontoObject(books){returnbooks.reduce((pre,cur)=>{/***...rest用于获取剩余的解构数据*例如:{name:"CSSWorld",author:"ZhangXinxu",price:69}*/const{serialNumber,...rest}=cur;pre[serialNumber]=rest;returnpre;},{});}constmap=toObject(books)/***{*ISBN:97871151759:{name:"CSSWorld",作者:《张新旭》,售价:69},*I247.57/105:{姓名:《活着》,作者:《余华》,售价:17.5},*9787010041155:{姓名:《资本论》,作者:"Marx",price:75}*}*/第二个对象形式//Scheme1constperson=[{name:"Siri",age:22},{name:"Bob",age:20},{name:"Tom",age:21}];functiontoObject(person){returnperson.reduce((pre,cur)=>(pre[cur.name]=cur.age,pre),{})}constresult=toObject(person)}//{Siri:22,Bob:20,Tom:21}//解决方案2functiontoObject2(person){returnperson.reduce((pre,cur)=>({...pre,[cur.name]:cur.age}),{})}constresult=toObject2(person)//{Siri:22,Bob:20,Tom:21}参考文章解锁多个JavaScript数组去重手势你不得不知道的25个数组reduce的高??级用法