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

请实现一个 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);
}

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106289384