You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组扁平化中arr[i]的添加方式解析:push还是concat?

数组扁平化递归实现的核心逻辑拆解

首先得戳破你忽略的关键:每次调用flatten函数,都会创建一个完全独立的flat数组——不是所有调用共用最外层初始的那个flat = []。递归的结果是通过函数返回值层层传递,再用concat合并到上层的数组里,而不是直接往外层数组塞元素。

我们一步步模拟执行过程,拿你给的arr = [[1, 2, 3], [4, [5, 6]], [[7], [8, [9]]], 10]举例子:

第一步:最外层调用flatten(arr)

  • 这里创建了第一个flat,初始值是[]。
  • 开始遍历数组的第一个元素:[1,2,3],判断是数组,执行flat = flat.concat(flatten([1,2,3]))。

第二步:进入递归调用flatten([1,2,3])

  • 这里创建了第二个独立的flat,初始也是[]。
  • 遍历元素1:不是数组,执行flat.push(1),此时这个flat变成[1]。
  • 遍历元素2:同样push,flat变成[1,2]。
  • 遍历元素3:push后flat变成[1,2,3]。
  • 遍历结束,这个递归调用返回[1,2,3]给上层。

第三步:回到最外层的concat操作

  • 最外层的flat原本是空数组,执行[] concat [1,2,3],结果是[1,2,3],所以最外层的flat现在变成这个数组。

再看第二个元素[4, [5,6]]的处理

  • 最外层遍历到这个元素,调用flatten([4, [5,6]]),创建第三个独立的flat(初始[])。
  • 遍历元素4:不是数组,push后flat变成[4]。
  • 遍历元素[5,6]:是数组,调用flatten([5,6]),创建第四个flat,push5、6后返回[5,6]。
  • 回到这个递归层,执行flat = [4].concat([5,6]),得到[4,5,6],返回给最外层。
  • 最外层的flat现在是[1,2,3].concat([4,5,6]),变成[1,2,3,4,5,6]。

解答你的核心疑惑

  1. 子数组的元素不是直接推到最外层的flat:每个递归调用里的arr[i]元素,是push到当前递归调用自己的flat数组里,这个数组只属于当前这次函数执行。
  2. flat.concat(flatten(arr[i]))拼接的是什么:flatten(arr[i])会先把子数组完全扁平化,然后返回这个扁平化后的数组;concat就是把这个返回的数组,合并到当前层的flat里。
  3. 元素怎么传递到上层:每次递归调用结束都会返回自己处理好的扁平化数组,上层通过concat把这个结果合并到自己的flat中,最终层层传递回最外层,得到完整的扁平化数组。

你之前忽略的就是每个递归调用都有独立的flat变量,递归的结果是通过返回值传递,而不是直接修改外层数组。


内容的提问来源于stack exchange,提问作者BillyG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:05:25