为了账号安全,请及时绑定邮箱和手机立即绑定

数组的Array.prototype.flat()方法,怎么使用尾递归来实现呢

数组的Array.prototype.flat()方法,怎么使用尾递归来实现呢

ABOUTYOU 2019-05-11 17:09:47
Array.prototype.flat()方法可以将嵌套数组进行扁平化处理成一维数组,可以接受一个数字为展开的几层,默认为1层。如果不管嵌套多少层都展开可以传入一个Infinity。letarr1=[1,2,3,4,5,[6,7,8,9,10]]arr1.flat();//[1,2,3,4,5,6,7,8,9,10]letarr2=[1,2,3,[4,5,6,[7,8,9,[10]]]]//这里嵌套了好几层arr2.flat(Infinity)//[1,2,3,4,5,6,7,8,9,10]//递归实现functionflat(arr){if(arr.length
查看完整描述

2 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

functionflat(arr){
varret=[]
vardirty=false
arr.forEach(item=>{
if(Array.isArray(item)){
dirty=true
ret.push(...item)
}else{
ret.push(item)
}
})
returndirty?flat(ret):ret
}
                            
查看完整回答
反对 回复 2019-05-11
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

首先,只要是递归就可能爆,如果不想爆要么指定深度结束,要么换别的方法实现。
functionfn1(deep){
if(deep>0){
deep--
returnfn1(deep)
}
return;
}
fn1(100000)
栗子
//循环实现
functionflat(arr){
if(arr.length<1||!arrinstanceofArray)returnarr;
letnewArray=[]
while(arr.length>0){
letnextTask=[];
for(letiofarr){
if(iinstanceofArray){
nextTask=nextTask.concat(i);
}else{
newArray.push(i)
}
}
arr=nextTask;
}
returnnewArray;
}
//生成深度测试数组用于验证爆栈
lettestArray=Array(100000).fill().map((d,i)=>([i])).reduce((acc,cur)=>{
cur[1]=acc;
returncur;
})
console.log(flat(testArray))
                            
查看完整回答
反对 回复 2019-05-11
  • 2 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信