【前端手撕】flat数组扁平化

数组扁平化 ,是指将一个嵌套的多维数组,按照指定的深度(depth) ,逐层剥离外层的 [] 包装,将其转换为嵌套层数更少(直至完全一维)的数组结构。

深度(depth)控制着扁平化的程度:

  • depth = 1 :只剥掉最外面一层 []。例如 [1, [[2, 3], 4]][1, [2, 3], 4]

  • depth = 2 :剥掉两层 []。例如 [1, [[2, 3], 4]][1, 2, 3, 4]

  • depth = Infinity:无论嵌套多深,全部剥光,彻底变成一维数组。

代码

手撕的思路也就是一层一层剥开。要先判断是否是数组以及depth是否到0了,如果是数组且depth>0,就进行递归拼接;如果不满足条件,就直接push到结果数组里。

javascript 复制代码
function myFlat(arr, depth = 1) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i]) && depth) {
            // concat把多个数组拼接起来,返回新数组
            res = res.concat(myFlat(arr[i], depth - 1)) 
        } else {
            res.push(arr[i])
        }
    }
    return res
}

样例演示

假设调用 flat(arr, 1)(扁平化 1 层):

  1. 初始化let res = [],开始遍历外层数组。

  2. i=0arr[0] = 1,不是数组,else 分支,res.push(1)res = [1]

  3. i=1arr[1] = [2, [3, 4]],是数组且 depth = 1(真值),进入递归。

    • 调用 flat([2, [3, 4]], 0)(注意:depth - 1 = 0)。

    • 在递归内部:遍历 [2, [3, 4]]

      • 2 不是数组 → 推入。

      • [3, 4] 是数组,但此时 depth = 0(假值),if 条件不成立,走 else,直接把整个 [3, 4] 推入。

    • 递归返回 [2, [3, 4]]

    • 外层执行 res = res.concat([2, [3, 4]])res = [1, 2, [3, 4]]

  4. 遍历结束 ,返回 [1, 2, [3, 4]]

Tips

1.flat() 在执行时会自动移除数组中的空位(empty),但会保留 undefinednull

javascript 复制代码
const arr = [1, , 2, [3, , 4]];
console.log(arr.flat()); // [1, 2, 3, 4]  

这是因为原生 flat 在遍历时,会跳过空位(不进入循环),所以空位直接被忽略了。

2.flat() 不修改原数组,而是返回一个新数组,符合 React/Vue 等框架的"不可变数据"原则。

相关推荐
zlinear数据采集卡17 分钟前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
GeekZHR2 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
.道阻且长.2 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)2 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年2 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.2 小时前
整数等差数列超图中的三个非微扰现象
算法
wabs6663 小时前
关于字符串【力扣541.反转字符串II的思考】
数据结构·算法·leetcode·字符串
土司大王3 小时前
LeetCode hot100——移动零
java·算法·leetcode
Tyler_TXZ4 小时前
C++C语言之——树
c语言·c++·算法·
hansang_IR4 小时前
【记录】「COCI 2024/2025」四道模拟赛/8.13
c++·算法