请用 JavaScript 实现一个数组扁平化方法,功能类似于 Array.prototype.flat,要求写出可运行的代码并说明其实现思路。
考察说明
考查对数组扁平化算法及其边界处理的理解,以及编写清晰、健壮代码的能力。
回答思路
- 【回答框架 1】数组扁平化的核心是将嵌套数组递归地展开到指定深度。实现时先定义函数,接收数组和默认深度1,然后创建一个新数组用于存放结果。
- 【回答框架 2】遍历数组每一项,若该项为数组且当前深度大于0,则递归调用扁平化函数,将返回的结果通过concat拼接到输出;否则直接将该项加入输出。深度由参数控制,默认1,若传入Infinity则完全扁平化。
- 【回答框架 3】一个非递归实现可利用栈,处理顺序略有不同,但核心逻辑相同,需注意保持元素相对顺序,并在循环中判断当前深度,避免无限展开循环引用(但通常假设输入无循环引用)。
- 【回答框架 4】需考虑边界情况:空数组、包含空数组、深度为0时返回原数组副本,以及非数组元素如null、undefined应原样保留。最终返回新数组,不修改原数组。
- 【关键点 1】递归实现时,深度每层递减,深度为0停止展开。
- 【关键点 2】使用Array.isArray判断元素是否为数组,避免与类数组混淆。
- 【关键点 3】concat方法可自动展开一层,但用于递归拼接时需注意不要错误使用。
- 【易错点 1】未限制深度导致无限递归(若存在循环引用)。
- 【易错点 2】误用push导致嵌套未被展开,应使用concat或展开运算符。
- 【易错点 3】未正确处理深度为0的情况,可能返回错误结果或抛错。