当前位置: 首页 > Web前端 > vue.js

面试官问了一系列的问题:数组扁平化(flattening)的flat方法是如何实现的

时间:2023-04-01 11:12:56 vue.js

鍓嶈█鍓嶆鏃堕棿闈㈣瘯瀹樺湪绉嬪闈㈣瘯bilibili鐨勬椂鍊欙紝闈㈣瘯瀹橀棶鍒帮細flat鏂规硶鏄浣曞疄鐜扮殑锛熼偅鏃跺€欙紝瀛楄抗杩樹笉瀹岀編銆傚悗鏉ュ洖鍘诲涔狅紝鍙戠幇瑕佹眰鎵嬪啓鏁扮粍鐢╢lat鏂规硶鍘嬫墎锛坒lattened锛夌殑闈㈣瘯瀹樹笉鍦ㄥ皯鏁般€傚叾涓寘鎷細鎷煎澶氥€佸皬绫炽€佺編鍥€佹淮婊淬€佽櫨鐨€佹湁璧炵瓑銆傛墜鍐欐墎骞冲寲鏄竴閬撻潪甯稿熀纭€鐨勯潰璇曢锛屼竴鑸嚭鐜板湪绗旇瘯鎴栬€呯涓€杞潰璇曚腑锛屼富瑕佽€冨療鎵嬪啓鐨勫熀鏈兘鍔涗唬鐮併€備粖澶╋紝璁╂垜浠粠鐞嗚В鎵佸钩鍖栫壒鎬у埌瀹炵幇鎵佸钩鍖栧啀鍒版姄浣忛潰璇曞畼鐨勭郴鍒楅棶棰橈紝閲嶆柊瀛︿範鏁扮粍鎵佸钩鍖栵紙flattening锛夌殑鎵佸钩鍖栨柟娉曘€侴ithub鎴虫垜涓€娈典唬鐮佹€荤粨Array.prototype.flat()鐗规€ф敞锛氭暟缁勬墎骞冲寲鏂规硶Array.prototype.flat()涔熷彨鏁扮粍鎵佸钩鍖栵紝鏁扮粍鎵佸钩鍖栵紝鏁扮粍闄嶇淮銆傛湰鏂囩粺涓€鍛藉悕涓猴細arrayshootingflatconstanimals=["馃惙",["馃惗","馃悅"],["馃悗",["馃悜",["馃惒"]],"馃悰"]];//涓嶄紶鍙傛暟鏃讹紝榛樿鈥滃帇鎵佲€濅竴灞俛nimals.flat();//["馃惙","馃惗","馃悅","馃悗",["馃悜",["馃惒"]],"馃悰"]//浼犲叆涓€涓暣鍨嬪弬鏁帮紝鏁村瀷涓衡€滃帇鎵佲€濈殑灞傛暟animals.flat(2);//["馃惙","馃惗","馃悅","馃悗","馃悜",["馃惒"],"馃悰"]//Infinity鍏抽敭瀛椾綔涓哄弬鏁版椂锛屾棤璁哄祵濂楀灏戝眰锛岄兘浼氳浆涓轰竴缁存暟缁刟nimals.flat(Infinity);//["馃惙","馃惗","馃悅","馃悗","馃悜","馃惒","馃悰"]//浼犻€掍竴涓?=0鐨勬暣鏁板皢杩斿洖娌℃湁"鐨勫師濮嬫暟缁勬墎骞冲寲"animals.flat(0);animals.flat(-10);//["馃惙",["馃惗","馃悅"],["馃悗",["馃悜",["馃惒"]],"馃悰"]];//濡傛灉鍘熷鏁扮粍鏈夌┖闂达紝flat()鏂规硶浼氳烦杩囩┖妲姐€俒"馃惙","馃惗","馃悅","馃悗",,].flat();//["馃惙","馃惗","馃悅","馃悗"]Array.prototype.flat()鐗规€ф€荤粨Array.prototype.flat()鐢ㄤ簬灏嗗祵濂楁暟缁勨€滄墎骞冲寲鈥濅负涓€缁存暟缁勩€傛鏂规硶杩斿洖涓€涓柊鏁扮粍锛屽鍘熷鏁版嵁娌℃湁褰卞搷銆備笉浼犲弬鏁版椂锛岄粯璁も€滃睍骞斥€濅竴灞傦紝鍙互浼犲叆涓€涓暣鏁拌〃绀衡€滃睍骞斥€濈殑灞傛暟銆備紶閫?=0鐨勬暣鏁板皢杩斿洖鍘熷鏁扮粍銆傚綋Infinity鍏抽敭瀛椾笉浣滀负鍙傛暟鈥滄墎骞冲寲鈥濇椂锛屾棤璁哄祵濂楀灏戝眰锛岄兘浼氳杞崲鎴愪竴缁存暟缁勩€傚鏋滃師鏁扮粍鏈夌┖浣嶏紝Array.prototype.flat()浼氳烦杩囩┖浣嶃€侼闈㈣瘯瀹樿繛缁棶浜嗙涓€涓棶棰橈細瀹炵幇涓€涓畝鍗曠殑鏁扮粍灞曞钩鍑芥暟棣栧厛鎴戜滑浼氳姳涓€鐐圭瘒骞呰璁轰竴涓嬪浣曞疄鐜颁竴涓畝鍗曠殑鏁扮粍灞曞钩灞曞钩鍑芥暟锛岃缁嗕粙缁嶅悇绉嶅疄鐜版柟妗堬紝鐒跺悗灏濊瘯缁х画闈㈣瘯瀹樼殑鐩存挱杩炵画鎻愰棶銆傚浣曞疄鐜拌繖涓兂娉曪紵鎬濊矾寰堢畝鍗曪細瑕佸疄鐜颁竴涓叿鏈夋墎骞冲寲鏁扮粍鍔熻兘鐨勬墎骞冲寲鍑芥暟锛屾垜浠彧闇€瑕佸湪鏁扮粍涓壘鍒版暟缁勭被鍨嬬殑鍏冪礌锛岀劧鍚庡睍寮€鍗冲彲銆傝繖鏄疄鐜伴樀鍒楁墎骞冲寲鐨勬墎骞冲寲鏂规硶鐨勫叧閿€濇兂銆傛湁浜嗘€濊矾锛屾垜浠渶瑕佽В鍐冲疄鐜拌繖涓€嬧€嬫€濊矾闇€瑕佸厠鏈嶇殑闅剧偣锛氶鍏堣瑙e喅鐨勬槸閬嶅巻鏁扮粍鐨勬瘡涓€涓厓绱狅紱绗簩瑕佽В鍐崇殑鏄垽鏂厓绱犳槸鍚︿负鏁扮粍锛涚涓変釜瑕佽В鍐崇殑鏄皢鏁扮粍鐨勫厓绱犲睍寮€涓€灞傦紱閬嶅巻鏁扮粍鐨勬柟妗堥亶鍘嗘暟缁勫苟鑾峰彇鏁扮粍鍏冪礌鐨勬柟娉曟湁寰堝绉嶏紝鍖呮嫭浣嗕笉闄愪簬浠ヤ笅鍑犵锛歠orloopfor...offor...inforEach()entries()keys()values()reduce()map()constarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"瀛楃涓?,{name:"鎵撻搧铔嬬殑鍚屽"}];//閬嶅巻鏁扮粍鐨勬柟寮忓お澶氾紝鏈枃鍙垪涓惧父鐢ㄧ殑//forloopfor(leti=0;i{console.log(value);});//entries()for(let[index,value]ofarr.entries()){console.log(value);}//keys()for(letindexofarr.keys()){console.log(arr[index]);}//values()for(letvalueofarr.values()){console.log(value);}//reduce()arr.reduce((pre,cur)=>{console.log(cur);},[]);//map()arr.map(鍊?>console.log锛堝€硷級锛夛紱鍙鏄兘澶熼亶鍘嗘暟缁勫緱鍒版暟缁勪腑鐨勬瘡涓€涓厓绱犵殑鏂规硶锛岄兘鏄彲琛屾柟妗堛€傚垽鏂厓绱犳槸鍚︿负鏁扮粍鐨剆chemeofconstructorObject.prototype.toStringisArrayconstarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5銆?string",{name:"鎵撻搧铔嬬殑鍚屽"}];arrinstanceofArray//truearr.constructor===Array//trueObject.prototype.toString.call(arr)==='[objectArray]'//trueArray.isArray(arr)//true璇存槑锛歩nstanceof杩愮畻绗﹀亣瀹氬彧鏈変竴涓叏灞€鐜銆傚鏋滅綉椤靛寘鍚涓鏋跺拰澶氫釜鍏ㄥ眬鐜锛屽鏋滄偍灏嗕竴涓暟缁勪粠涓€涓鏋朵紶閫掑埌鍙︿竴涓鏋讹紝鍒欓€氳繃瀵煎叆鐨勬暟缁勫拰鍦ㄧ浜屼釜妗嗘灦涓湰鍦板垱寤虹殑鏁扮粍鍏锋湁鍚勮嚜涓嶅悓鐨勬瀯閫犲嚱鏁般€傦紙鎵€浠ュ湪杩欑鎯呭喌涓嬩細涓嶅噯纭級typeof鎿嶄綔绗︿細杩斿洖object鏉ュ彇鏁扮粍鐨勭被鍨嬨€傚洜涓烘瀯閫犲嚱鏁板彲浠ユ敼鍐欙紝鎵€浠ヤ笉鑳戒繚璇佹槸鏁扮粍銆俢onststr='abc';str.constructor=鏁扮粍锛泂tr.constructor===Array//true灏嗘暟缁勭殑鍏冪礌鎵╁睍鍒颁竴灞傘€傛墿灞曡繍绠楃+concatconcat()鏂规硶鐢ㄤ簬鍚堝苟涓や釜鎴栧涓暟缁勶紝鍦ㄦ嫾鎺ユ椂鍔犲叆鎵╁睍杩愮畻绗︿細鎵╁睍涓€灞傛暟缁勩€傛湁鍏宠缁嗕俊鎭紝璇峰弬瑙佷笅闈㈢殑浠g爜銆俢oncat+apply涓昏浣跨敤apply鏉ョ粦瀹氫綔鐢ㄥ煙銆備紶鍏ョ殑绗簩涓弬鏁版槸鏁扮粍鎴栫被鏁扮粍瀵硅薄锛屾暟缁勫厓绱犲皢浣滀负鍗曠嫭鐨勫弬鏁颁紶閫掔粰func鍑芥暟銆傚嵆鍦ㄨ皟鐢╝pply鍑芥暟鐨勮繃绋嬩腑锛屼紶鍏ョ殑鏁扮粍浼氫竴涓竴涓紶閫掔粰瑕佹墽琛岀殑鍑芥暟锛岀浉褰撲簬鎶婃暟缁勬墿鍏呬竴灞傘€倀oString+split涓嶆帹鑽愪娇鐢╰oString+split鏂规硶锛屽洜涓烘搷浣滃瓧绗︿覆鏄竴浠跺嵄闄╃殑浜嬫儏銆備笂涓€绡囨枃绔犲仛浜嗕竴涓搷浣滃瓧绗︿覆鐨勬渚嬶紝琚緢澶氭湅鍙嬭療鐥呫€傚鏋滄暟缁勪腑鐨勬墍鏈夊厓绱犻兘鏄暟瀛楋紝toString+split鏄彲琛岀殑锛屽彲浠ヤ竴姝ュ畬鎴愩€俢onstarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"鎵撻搧鐨勫悓瀛ggs"}];//浼犳挱杩愮畻绗?concat[].concat(...arr)//[1,2,3,4,1,2,3,[1,2,3,[1,2,3]],5,"string",{name:"鐜╅搧铔嬬殑鍚屽"}];//concat+apply[].concat.apply([],arr);//[1,2,3,4,1,2,3,[1,2,3,[1,2,3]],5,"string",{name:"鎵撻搧铔嬬殑鍚屽"}];//toString+splitconstarr2=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]]]arr2.toString().split(',').map(v=>parseInt(v))//[1,2,3,4,1,2,3,1,2,3,1,2,3]鎬荤粨涓€涓嬭瑙e喅鐨勪笁澶ч毦鐐癸紝閭d箞鎴戜滑灏卞彲浠ュ疄鐜板畠寰堝鏄撳皢鏁扮粍鐨勫钩闈㈠嚱鏁扮殑涓€涓増鏈睍骞炽€俢onstarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"鎵撻搧鐨勫悓瀛ggs"}];//concat+閫掑綊鍑芥暟flat(arr){letarrResult=[];arr.forEach(item=>{if(Array.isArray(item)){arrResult=arrResult.concat(arguments.callee(item));//閫掑綊//鎴栦娇鐢ㄦ墿灞曡繍绠楃//arrResult.push(...arguments.callee(item));}else{arrResult.push(item);}});returnarrResult;}flat(arr)//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"瀛︾敓鎵撻搧铔嬧€潁];鍒拌繖閲岋紝鎭枩浣犳垚鍔熷緱鍒伴潰璇曞畼瀵逛綘鎵嬫挄浠g爜鑳藉姏鐨勫熀鏈鍙煄夈€備絾闈㈣瘯瀹樺線寰€浼氫笉姝簬姝わ紝杩樹細缁х画鑰冨療闈㈣瘯瀹樼殑鍚勭鑳藉姏銆傜浜岄锛氫娇鐢╮educe瀹炵幇flat鍔熻兘銆傛垜瑙佽繃寰堝闈㈣瘯瀹樺枩娆㈢偣鍚嶈姹傞潰璇曞畼鐩存帴鐢╮educe瀹炵幇flat鍔熻兘銆傛兂鐭ラ亾涓轰粈涔堝悧锛熸枃绔犲悗鍗婇儴鍒嗚€冭檻鍒版暟缁勭┖浣嶇殑鎯呭喌灏辩煡閬撲负浠€涔堜簡銆傚叾瀹炴€濊矾鏄竴鏍风殑銆俢onstarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"鎵撻搧鐨勫悓瀛ggs"}]//鍏堢敤reduce灞曞紑涓€灞俛rr.reduce((pre,cur)=>pre.concat(cur),[]);//[1,2,3,4,1,2,3,[1,2,3,[1,2,3]],5,"string",{name:"鎵撻搧铔嬬殑鍚屽"}];//浣跨敤reduce灞曞紑涓€灞?閫掑綊constflat=arr=>{returnarr.reduce((pre,cur)=>{returnpre.concat(Array.isArray(cur)?flat(cur):cur);},[]);};//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"鐜╅搧铔嬬殑鍚屽"}];绗笁棰橈細鍒╃敤stack鐨勬€濇兂瀹炵幇flatfunction//Stackthinkingfunctionflat(arr){constresult=[];甯搁噺鍫嗘爤=[].concat(arr);//灏嗘暟缁勫厓绱犲鍒跺埌鏍堜腑锛岀洿鎺ヨ祴鍊间細鏀瑰彉鍘熸暟缁?/濡傛灉鏍堜笉涓虹┖锛屽垯寰幆while(stack.length!==0){constval=stack.pop();濡傛灉(Array.isArray(val)){stack.push(...val);//濡傛灉鏁扮粍鍐嶆鍏ユ爤锛屽張灞曞紑涓€灞倉else{result.unshift(val);//濡傛灉涓嶆槸鏁扮粍锛屽氨鍙栧嚭鏉ユ斁鍒皉esult鏁扮粍涓瓆}returnresult;}constarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"鐜╅搧铔嬬殑鍚屽"}]flat(arr)//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"鐜╅搧铔嬬殑鍚屽"}];绗洓涓棶棰橈細閫氳繃浼犲叆鏁存暟鍙傛暟鏉ユ帶鍒垛€滄墎骞冲寲鈥濆眰鏁?/reduce+recursivefunctionflat(arr,num=1){returnnum>0?鍒般€俽educe((pre,cur)=>pre.concat(Array.isArray(cur)?flat(cur,num-1):cur),[]):arr銆俿lice();}constarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"瀛楃涓?,{鍚嶇О:"鐜╅搧铔嬬殑鍚屽"}]flat(arr,Infinity);//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"鐐稿脊閾佽泲鍚屽"}];闂5锛氫娇鐢℅enerator瀹炵幇骞抽潰鍑芥暟function*flat(arr,num){if(num===undefined)num=1;for(constitemofarr){if(Array.isArray(item)&&num>0){//num>0yield*flat(item,num-1);}else{鏀剁泭椤圭洰;}}}constarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"瀛︾敓Bombard"}]//璋冪敤Generator鍑芥暟鍚庯紝鍑芥暟骞舵病鏈夋墽琛岋紝杩斿洖鐨勪笉鏄嚱鏁拌繍琛岀粨鏋滐紝鑰屾槸涓€涓寚鍚戝唴閮ㄧ姸鎬佺殑鎸囬拡瀵硅薄//鍗宠凯浠e櫒瀵硅薄锛圛teratorObject锛夈€傛墍浠ユ垜浠繀椤讳娇鐢ㄤ竴娆″睍寮€杩愮畻绗︽潵寰楀埌缁撴灉[...flat(arr,Infinity)]//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"瀛︾敓鐜╅搧铔?}];绗叚棰橈細瀹炵幇鍦ㄥ師鍨嬮摼涓婇噸鍐檉latfunctionArray.prototype.fakeFlat=function(num=1){if(!Number(num)||Number(num)<0){returnthis;}璁゛rr=this.concat();//鑾峰彇璋冪敤fakeFlat鍑芥暟鐨勬暟缁剋hile(num>0){if(arr.some(x=>Array.isArray(x))){arr=[].concat.apply([],arr);//濡傛灉鏁扮粍涓湁鏁扮粍鍏冪礌涓攏um>0锛屽垯缁х画鎵╁厖涓€涓暟缁剗else{break;//array涓病鏈夋暟缁勫厓绱狅紝涓嶇num鏄惁杩樺ぇ浜?锛屽仠姝㈠惊鐜€倉鏁?-;}杩斿洖arr;};constarr=[1,2,3,4,[1,2,3,[1,2,3,[1,2,3]]],5,"string",{name:"鎵撻搧鐨勫悓瀛ggs"}]arr.fakeFlat(Infinity)//[1,2,3,4,1,2,3,1,2,3,1,2,3,5,"string",{name:"Student鐐嚮"}];绗竷棰橈細鑰冭檻鏁扮粍绌轰綅鐨勬儏鍐典粠鎴戜滑涓€寮€濮嬫€荤粨鐨刦lat鐗规€ф垜浠煡閬擄紝flat鍑芥暟鐨勬墽琛屼細璺宠繃绌轰綅銆侲S5澶у鏁版暟缁勬柟娉曞湪澶勭悊闂撮殭鏃堕兘浼氶€夋嫨璺宠繃闂撮殭锛屽寘鎷細forEach()銆乫ilter()銆乺educe()銆乪very()鍜宻ome()閮戒細璺宠繃闂撮殭銆傛墍浠ユ垜浠彲浠ョ敤涓婇潰鐨勬柟娉曟潵瀹炵幇骞宠烦绌轰綅鐨勭壒鎬?/reduce+recursionArray.prototype.fakeFlat=function(num=1){if(!Number(num)||Number(num)<0){褰掕繕杩欎釜锛泒璁゛rr=[].concat(this);杩斿洖num>0锛焌rr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?cur.fakeFlat(--num):cur),[]):arr.slice();};constarr=[1,[3,4],,,];arr.fakeFlat()//[1,3,4]//foEach+閫掑綊Array.prototype.fakeFlat=function(num=1){if(!Number(num)||Number(num)<0){杩斿洖杩欎釜锛泒璁゛rr=[];this.forEach(item=>{if(Array.isArray(item)){arr=arr.concat(item.fakeFlat(--num));}else{arr.push(item);}});杩斿洖arr;};constarr=[1,[3,4],,,];arr.fakeFlat()//[1,3,4]寤朵几闃呰锛氱敱浜庡绌烘牸鐨勫鐞嗚鍒欏緢涓嶄竴鑷达紝寤鸿閬垮厤绌烘牸銆侲S5瀵归棿闅欑殑澶勭悊寰堜笉涓€鑷达紝澶ч儴鍒嗘儏鍐典笅闂撮殭閮戒細琚拷鐣ャ€俧orEach()銆乫ilter()銆乺educe()銆乪very()鍜宻ome()閮戒細璺宠繃绌烘Ы銆俶ap()灏嗚烦杩囩┖妲斤紝浣嗕繚鐣欏€笺€俲oin()鍜宼oString()灏嗙┖鐧借涓烘湭瀹氫箟锛屽皢undefined鍜宯ull瑙嗕负绌哄瓧绗︿覆銆侲S6鏄惧紡鍦板皢绌烘牸杞崲涓烘湭瀹氫箟銆俥ntries()銆乲eys()銆乿alues()銆乫ind()鍜宖indIndex()浼氬皢闂撮殭瑙嗕负鏈畾涔夈€俧or...of寰幆閬嶅巻绌烘Ы銆俧ill()浼氬皢绌烘Ы瑙嗕负鏅€氭暟缁勪綅缃€俢opyWithin()灏嗗鍒剁┖妲姐€傛墿灞曡繍绠楃(...)杩樺皢绌虹櫧杞崲涓烘湭瀹氫箟銆侫rray.from鏂规硶浼氬皢鏁扮粍鐨勭┖缂鸿浆涓簎ndefined銆傜患涓婃墍杩帮紝闈㈣瘯瀹樺疄鍦拌€冨療浜嗕竴涓啓浠g爜鐨勯鐩€傚叾瀹炰笉浠呬粎鏄啓浠g爜銆傚湪鍐欎唬鐮佺殑杩囩▼涓紝浼氶亣鍒颁唬鐮佺殑鍚勭鐭ヨ瘑鐐瑰拰杈圭晫鏉′欢銆傝櫧鐒跺ぇ澶氭暟鎯呭喌涓嬶紝闈㈣瘯瀹樹笉浼氳繖涔堝彉鎬侊紝鍙槸flatimplement涓嶆柇鐨勮川鐤戦潰璇曞畼锛屾墜鎾曞ソ鍑犱釜鐗堟湰锛屼絾鏄潰璇曞畼浼氳姹傛牴鎹綘鍐欑殑浠g爜鐗堟湰鍐欏嚭鏇村畬缇庣殑鐗堟湰.鐗堟湰寰堝父瑙併€傚彧瑕佹垜浠矇涓嬪績鏉ワ紝鎵撳ソ鍩虹锛屼笉绠¢潰璇曞畼鎬庝箞闂紝鎴戜滑閮借兘鐣呮墍娆茶█銆傛墎骞冲寲鐨勫疄鐜扮粷瀵逛笉闄愪簬鏂囩珷涓垪鍑虹殑鐗堟湰銆傝嚜宸辨暡浠g爜鏄渶濂界殑杩涙銆傚湪璇勮鍖烘垨issue涓啓鍑轰綘鑷繁鐨勭増鏈紒浠婂ぉ鎴戝浼氫簡銆傚鏋滀綘瀛︿範浜嗭紝璇峰叧娉ㄥ苟鐐逛釜璧烉煈嶃€傛帹鑽愰槄璇讳綘涓嶇煡閬撶殑JSON.stringify()鐨勫己澶?/p>