推荐答案
function flatten(arr) { return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []); }
本题详细解读
题目分析
题目要求实现一个函数 flatten(arr)
,将多维数组扁平化为一维数组。例如,输入 [1, [2, [3, 4], 5]]
,输出应为 [1, 2, 3, 4, 5]
。
解题思路
- 递归处理:由于数组可能嵌套多层,因此需要使用递归来处理每一层的数组。
- 数组拼接:使用
concat
方法将当前元素与已处理的部分数组拼接起来。 - 判断数组类型:使用
Array.isArray()
方法判断当前元素是否为数组,如果是数组则递归调用flatten
函数。
代码解析
reduce
方法:reduce
方法用于遍历数组,并将数组中的每个元素累加到一个初始值(这里是空数组[]
)。Array.isArray(val)
:判断当前元素val
是否为数组。acc.concat(flatten(val))
:如果val
是数组,则递归调用flatten
函数,并将结果与acc
拼接。acc.concat(val)
:如果val
不是数组,则直接将val
拼接到acc
中。
示例
const arr = [1, [2, [3, 4], 5]]; console.log(flatten(arr)); // 输出: [1, 2, 3, 4, 5]
时间复杂度
- 该算法的时间复杂度为 O(n),其中 n 是数组中所有元素的总数。因为每个元素都会被访问一次。
空间复杂度
- 空间复杂度为 O(d),其中 d 是数组的嵌套深度。递归调用栈的深度取决于数组的嵌套层数。