如何在函数内部创建数组实现嵌套数组的递归展开?
如何在递归函数内部实现嵌套数组展开
当然可以!完全不需要依赖外部数组来存储展开结果,我们可以让递归函数自己管理内部的数组,通过递归调用的返回值来逐层拼接最终结果。先看看你现有代码的几个小问题:
- 依赖外部的
newArray会导致函数不是纯函数,多次调用时会保留之前的结果; arr.forEach(...)的返回值是undefined,所以arr = arr.forEach(...)这行代码其实没有意义。
下面是两种在函数内部创建数组的实现方式:
方法一:forEach + 内部数组拼接
var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68]; function nestedArray(arr) { // 每次调用函数时,内部创建一个新的空数组用于存储当前层级的展开结果 let result = []; arr.forEach(item => { if (Array.isArray(item)) { // 如果当前元素是数组,递归展开它,并用扩展运算符把结果合并到当前result中 result.push(...nestedArray(item)); } else { // 非数组元素直接加入结果 result.push(item); } }); return result; } // 调用测试 console.log(nestedArray(test));
方法二:用reduce简化逻辑
reduce非常适合这种需要累积结果的场景,我们可以用它来直接构建展开后的数组:
var test = [1,2,33,[55,88,[23,[211],66,998],2000],4,2002,[111,58,22,[120],15],68]; function nestedArray(arr) { // 初始值是空数组(也就是内部的存储容器),通过reduce迭代累积结果 return arr.reduce((accumulator, currentItem) => { // 如果当前元素是数组,递归展开后合并到累加器;否则直接合并当前元素 return accumulator.concat(Array.isArray(currentItem) ? nestedArray(currentItem) : currentItem); }, []); } // 调用测试 console.log(nestedArray(test));
这两种实现都是纯函数,不依赖任何外部变量,每次调用都会返回全新的展开数组,逻辑清晰且复用性更强。
内容的提问来源于stack exchange,提问作者Nelson Chen
相关产品推荐
相关产品推荐

