ES6的数组的flat方法的主要作用是进行数组降维处理。该方法返回的是一个新数组,对原数组没有影响。

实现方法1 利用reduce和spead运算符

function flat1(arr){
    return arr.reduce((accu,cur)=>{
        return Array.isArray(cur)?[...accu,...flat1(cur)]:[...accu,cur]
    } ,[]);
}
1
2
3
4
5

实现方法2 利用reduce和contact

function flat2(arr){
    return arr.reduce((accu,cur)=>{
        return Array.isArray(cur)?accu.concat(flat2(cur)):accu.concat(cur);
    } ,[]);
}
1
2
3
4
5

实现方法3 通过判断数组中最后一个元素是否数组,是的话,就继续循环取最后一个元素,直到最后一个元素不为数组为止,然后再将数组逆序放入一个新的数组。

function flat3(arr){
    let res=[];
    let cloneArr=[...arr];
    while(cloneArr.length){
        let lastEle=cloneArr.pop();
        if(Array.isArray(lastEle)){
            cloneArr.push(...lastEle);
        }else{
            res.push(lastEle);
        }
    }
    return res.reverse();
}
1
2
3
4
5
6
7
8
9
10
11
12
13

实现方法3的改进

function flat3(arr){
    let res=[];
    let cloneArr=[...arr];
    while(cloneArr.length){
        let lastEle=cloneArr.pop();
        if(Array.isArray(lastEle)){
            cloneArr.push(...lastEle);
        }else{
            //此时最后一个元素不是数组了,此时已经是一维数组
            return cloneArr.concat(lastEle);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

实现方法4

//实现思想跟方法3差不多
function flat4(arr){
    while(arr.some(item=>Array.isArray(item))){
        arr=[].concat(...arr);
    }
    return arr;
}
1
2
3
4
5
6
7

评 论:

Last Updated: 1/16/2020, 12:57:39 AM