递归函数无法保存临时结果:提取嵌套对象双分支字符串值
递归收集嵌套对象分支字符串的解决方案
先看你的代码为啥返回空数组,核心问题有这几个:
- 没区分
main和offhand分支,递归时不知道该把字符串往哪个数组塞,而且只处理了直接是字符串的属性,嵌套对象里的字符串根本没遍历到; - 每次进入对象判断就新建一个空的
data,上层递归的结果全被覆盖了,最后自然留不下东西; - 遍历逻辑不全,遇到属性值是对象的时候直接跳过了,深层的字符串根本没机会被收集。
给你改好的代码,直接能用:
const obj = { main: { value: { value: 'main value'} , anotherValue : 'some another value' } , offhand: { value: { value: 'offhand value' , anotherValue: 'again recursion' } } } function devider(object) { // 先建好最终要返回的结果容器 const result = { fromMainHand: [], fromOffHand: [] }; // 写个内部递归函数,专门负责收集字符串到指定数组 function collect(currentObj, targetArr) { for (const key in currentObj) { const value = currentObj[key]; if (typeof value === 'string') { // 是字符串直接塞目标数组 targetArr.push(value); } else if (typeof value === 'object' && value !== null) { // 是对象就继续递归遍历它的属性 collect(value, targetArr); } } } // 分别处理main和offhand两个分支,把对应分支的字符串收集到各自数组 collect(object.main, result.fromMainHand); collect(object.offhand, result.fromOffHand); return result; } console.log(devider(obj));
运行后输出就是你要的:
{ fromMainHand: ['main value', 'some another value'], fromOffHand: ['offhand value', 'again recursion'] }
说下改了啥:
- 把递归收集的逻辑拆成内部函数
collect,每次传要处理的对象和目标数组,明确知道字符串该往哪放; - 不管属性是字符串还是嵌套对象都处理,深层的字符串也能被挖到;
- 结果容器在最外层只建一次,所有递归都往同一个容器里塞数据,不会丢失。
内容的提问来源于stack exchange,提问作者quester
相关产品推荐
相关产品推荐

