JS面试手写:flat函数的实现

91 阅读1分钟

flat()  方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

用法:var newArray = arr.flat([depth])

参数:depth 可选:指定要提取嵌套数组的结构深度,默认值为 1。

返回值:一个包含将数组与子数组中所有元素的新数组。

// 递归写法
// 使用 reduce、concat 和递归展开无限多层嵌套的数组
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flatDeep(arr, d = 1) {
   return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), []) : arr.slice();
};
flatDeep(arr1, Infinity);
// 非递归写法
function flatDeep(arr = [], depth = 1) {
    while(arr.some(item => (Array.isArray(item) && depth > 0))) {
        // ...arr每次只能展开一层
        arr = [].concat(...arr);
        // 限制层级
        depth--; 
    }
    return arr;
};
// const flatArr = flatDeep([1,2,3,[4,[5,[6]]]], Infinity)