扁平化数组

289 阅读1分钟

顾名思义 就是将数组中数组全部扁平化

常规APi

需要考虑兼容性 ie不支持 chrome需要版本69之上

[].flat()

手动实现flat

const flat = (arr, depth = 1) => {
    return depth >0 ? arr.reduce((prev, curr) => {
            if (Array.isArray(curr)) {
                return [...prev, ...flat(curr, depth - 1)]
            }
            return [...prev, curr]
        }, []) :
        arr
}
const flat = (arr, depth = 1) => {
    return depth > 0 ? arr.reduce((prev, curr) => {
        prev = prev.concat(Array.isArray(curr) ? flat(curr, depth - 1) : curr);
        return prev;
    }, []) : arr
}

lodash

平时开发足够 简单快捷

 _.flattenDeep(arr)

循环+创建一个新数组

function flatten(arr) {
   let res = []
   arr.forEach(item => {
       if (Array.isArray(item)) {
           res.push(...flatten(item));
           // res = res.concat(flatten(item))
       } else {
           res.push(item)
       }
   })
   return res;
}

while

function flatten(arr) {
    while (arr.some(item => Array.isArray(item))) {
        // es 5 写法
        //arr = Array.prototype.concat.apply([], arr)
        arr = [].concat(...arr);
    }
    return arr;
}

reduce

function flatDeep(arr) {
    return Array.isArray(arr) ?
        arr.reduce((prev, curr) => {
            prev = [...prev, ...flatDeep(curr)];
            return prev
        }, []) : [arr]
}
function flatten(arr) {
    return arr.reduce((prev, curr) => {
        prev = prev.concat(Array.isArray(curr) ? flatten(curr) : curr)
        return prev;
    }, [])
}

利用栈

function flat(arr) {
    let copyArr = arr.slice();
    const res = [];
    while (copyArr.length) {
        const first = copyArr.shift();
        if (Array.isArray(first)) {
            copyArr.unshift(...first)
        } else {
            res.push(first)
        }
    }
    return res;
}