每日一题(三九)请实现一个 flatenDeep 函数,把嵌套的数组扁平化

本文介绍了四种不同的方法来实现嵌套数组的扁平化,包括利用ES6的flat方法、reduce和concat、stack反嵌套以及toString和split转换。每种方法都有其特点和适用场景。

请实现一个 flatenDeep 函数,把嵌套的数组扁平化

flattenDeep([1,[2,[3,[4,[5]]]]]); //[1,2,3,4,5]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.直接利用 ES6 新增数组方法 flat, 用于将嵌套数组“拉平”,变成一维数组。该方法返回一个新数组,对原数组没有影响。flat 默认只会拉平一层,需要给 flat 传递一个参数,表示想要"拉平" 的层数。当参数大于等于嵌套的层数时,会将数组拉平为一维数组。当然它还允许我们传入 Infinity 参数,如论多少层都可以拉平。

function flattenDeep(arr){
     return arr.flat(Infinity)
}

2.可以利用 reduce 和 concat

function flattenDeep(arr){
    arr.reduce((prev,cur)=>{
        return prev.concat(Array.isArray(cur) ?
        flattenDeep(cur) :
        cur)},[])
}

3.使用 stack 无限反嵌套多层嵌套数组

function flattenDeep(input){
    const stack = [...input];
    const res = [];
    while(stack.length){
        //使用 pop 从stack 取出并移除值
        const next = stack.pop();
        if(Array.isArray(next)){
            //使用 push 送回内层数组中的元素,不会改变原始输入 origin input
            stack.push(next);
        }else{
            res.push(next);
        }
    }

    //使用 reverse 恢复原数组的顺序
    return res.reverse();
}

4.利用数组的 toString 方法返回 以 ,分割的字符串形式,但是这个方法会有一个问题,就是如果你的数组中不仅有字符串还有数字,那么经过 split 后都会是 字符串形式的数据,map 之后又会都转为数字,所以和原数组可能有差别。

function flattenDeep(arr){
    return arr.toString().split(',').map(item=>+item);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值