javascript-手写Array.prototype.flat()

loading 2022年04月18日 136次浏览

方法1:reduce

        const flattenDeep = (arr) => {
            return Array.isArray(arr)
                ?
                arr.reduce((a, b) => [...a, ...flattenDeep(b)], [])
                :
                [arr]
        }
        console.log(flattenDeep([1, [[2], [3, [4]], 5]]))

方法2:forEach

        var arr = [1, 2, [3, [4, 5]]];
        const eachFlat = (arr = [] , d = 1) =>{
            const result = [];
            (function flat(arr,d){
                arr.forEach(item => {
                    if(Array.isArray(item) && d > 0){
                        flat(item , d-1);
                    }else{
                        result.push(item);
                    }
                })
            })(arr,d)
            return result;
        }
        console.log(eachFlat(arr,Infinity))

方法3: 逐项遍历(较为简单且好理解)

var flat = function (arr, n) {
    while (n--) {
        let temp = [];
        for (let item of arr) {
            if (Array.isArray(item)) {
                temp.push(...item);
            } else {
                temp.push(item);
            }
        }
        arr = temp;
    }
    return arr;
};

上面的代码存在一定的性能问题,有一些特长用例可能会超时,下面是优化后的代码:

var flat = function (arr, n) {
    while (n--) {
        arr = [].concat(...arr);
    }
    return arr;
};

方法4:Generator

        var arr = [1, 2, [3, [4, 5]]];
        function* flatten(array){
            for(const item of array){
                if(Array.isArray(item)){
                    yield* flatten(item)
                }else{
                    yield item;
                }
            }
        }
        const res = [...flatten(arr)]
        console.log(res)