以下文章来自前端世界,作者奶酪在面试中经常被问到的数组相关问题。面试官:给你一个多级数组[1,[2,34,[12,4]],23],实现数组扁平化的方法有哪些,你能想到的就说吧。你:ES6不是提供了一个功能,flatten,用它来扁平化吗?面试官:嗯,除了这个还有别的办法吗?或者让你自己体会:不会,我一直都是这样用的。面试官:心理活动,你以为我不知道这个功能?我只是想问你这个功能吗?基本第一道面试题的日子已经死了。其实面试官的目的并不是要难你,而是通过这样一道JavaScript面试题来考察你的JavaScript基础。出来了,相信面试官对JavaScript_前端培训的基础部分应该还是比较满意的。接下来开始我们的学习方法1:使用最基本的递归遍历方法使用基本遍历方法,然后检查遍历的项是否为数组,如果是数组,则递归执行压扁函数,比较执行结果和前面联系,如果itemitem不是数组,那么直接把值push到初始定义的数组中letarray=[1,[2,34,[12,4]],23];functionflatten(array){letresult=[]for(constitemofarray){if(Array.isArray(item)){result=result.concat(flatten(item))}else{result.push(item)}}返回结果}console.log(flatten(array))方法二:使用reduce函数进行递归操作functionflatten(array){returnarray.reduce((pre,current,currentIndex,array)=>{if(Array.isArray(current)){returnpre.concat(flatten(current))}else{returnpre.concat(current)}},[])}方法三:while循环结合findIndex和扩展算子实现思路:使用while循环,循环判断条件,无论是concat后的rray包含数组类型,如果包含则使用...扩展运算符展开合并letarray=[1,[2,34,[12,4]],23]functionflatten(array){while(array.findIndex((item)=>Array.isArray(item)>0)){array=[].concat(...array)}返回数组}console.log(flatten(array))方法四:数组强制类型转换进行强制类型转换,然后使用split分离成数组,最后注意不要忘记转换成Number类型functionflatten(array){returnarray.toString().split(',').map(item=>Number(item))//'array.toString()转换结果1,2,34,12,4,23'}console.log(flatten(array))方法五:使用JSON函数和正则表达式实现思路:先用JSON.stringify对数组进行转换,然后用正则匹配去掉[],最外层添加[],最后用JSON.parse进行转换letarray=[1,[2,34,[12,4]],23];functionflatten(array){letresult=JSON.stringify(array);//JSON.stringify转换后的结果'[1,[2,34,[12,4]],23]'result=result.replace(/([|])/g,'');result='['+result+']';returnJSON.parse(result)}console.log(flatten(array));方法六:使用栈和展开运算符实现展平实现思路:创建一个栈结构,一个空数组,然后遍历栈结构,判断是否为数组,使用展开运算符展开,丢入栈中再不行的话,加上_web前端训练函数flatten(arr){letres=[];conststack=[].concat(arr);console.log('hahaha',stack)while(stack.length>0){console.log(stack.length,stack)constitem=stack.pop();if(Array.isArray(item)){//使用展开运算符展开一层堆栈。push(...item);}else{item!==undefined&&res.unshift(item);}}returnres;}console.log(flatten(array))方法七:利用ES6中的flatten函数实现思路:直接使用ES6提供的flatten函数实现flatten语法为arr.flatten([depth])depth可以传递数组的展开深度,(不填时默认值为1),即展开一层数组Infinity表示不管展开多少层,也可以设置其他扩展固定层数的整数letarray=[1,[2,34,[12,4]],23]functionflatten(array){returnarray.flat(Infinity)}console.log(flatten(array))说完这些方法,你会发现ES6提供的功能很优雅,而且还提供了展平层数的参数,www.atguigu.com可以选择展平层数。
