JS自定义myFlatten递归函数未返回预期扁平化结果求助
解决你的JS flatten函数返回原数组问题
Hey there! 作为有Ruby背景转JS的新手,碰到这种问题太正常啦——毕竟两个语言在数组处理上的细节差异很容易踩坑。你说手写的flatten函数返回原数组,大概率是没有正确收集递归结果或者函数末尾没返回处理后的新数组,这也是新手写递归扁平化最常犯的错。
先看一个典型的错误示例(你可能踩了类似的坑)
很多新手会写出这样的代码:
// 错误写法:递归没收集结果,最后返回原数组 function flatten(arr) { for (let item of arr) { if (Array.isArray(item)) { flatten(item); // 这里递归了,但没把扁平化后的子数组存起来! } } return arr; // 直接返回原输入,当然和输出一样 }
问题出在两处:一是递归调用flatten(item)时,只是执行了函数但完全没处理它的返回值;二是最后直接返回了原数组,而不是我们要的扁平化新数组。
正确的递归实现思路
这里给你两种常用的正确写法,你可以对照自己的代码找差异:
写法1:用累加器循环处理
function flatten(arr) { const result = []; for (const item of arr) { // 如果是子数组,递归扁平化后合并到结果里 if (Array.isArray(item)) { result.push(...flatten(item)); // 展开递归结果push,或者用concat } else { // 非数组元素直接加入结果 result.push(item); } } return result; // 关键!返回处理后的新数组,不是原数组 }
写法2:用reduce简化(类似Ruby的inject)
如果你习惯Ruby的函数式风格,JS的reduce方法会很顺手:
const flatten = arr => arr.reduce((acc, current) => { // 子数组就递归扁平化,否则直接加入累加器 return acc.concat(Array.isArray(current) ? flatten(current) : current); }, []); // 初始累加器是一个空数组
关键注意点(和Ruby的差异)
- Ruby的
flatten是直接返回新数组,JS里我们自己实现时也必须返回新的结果数组,不能直接返回原输入。 - 递归调用时,一定要把递归得到的扁平化子数组合并到主结果里(用
concat或者展开运算符...+push),不能只调用递归函数却不用它的返回值。
你可以对照自己的代码检查这两点,应该就能找到问题啦!
内容的提问来源于stack exchange,提问作者Monique
相关产品推荐
相关产品推荐

