如何用ES6实现数组与嵌套对象的双向递归转换?
嘿,这个需求用ES6来实现其实挺优雅的!我给你分享两个简洁高效的方法,分别处理正向和反向转换:
正向转换:数组 → 嵌套对象
这里用数组的reduceRight方法最合适,它会从数组的末尾开始遍历,刚好能帮我们从最内层的对象开始构建,一步步往外嵌套:
const arr = ['value1', 'value2', 'value3']; const arrayToNestedObj = (arr) => arr.reduceRight((accumulator, currentValue) => ({ value: currentValue, // 只有当存在上层对象时,才添加parent属性 ...(accumulator && { parent: accumulator }) }), null); // 测试一下 const nestedResult = arrayToNestedObj(arr); console.log(nestedResult); // 输出:{ value: 'value1', parent: { value: 'value2', parent: { value: 'value3' } } }
简单解释下:reduceRight的初始值是null,对应最内层对象(也就是value3那层),它不需要parent;然后每往左遍历一个元素,就把当前元素作为value,把之前构建好的对象作为parent,最终得到我们要的嵌套结构。
反向转换:嵌套对象 → 数组
反向转换用迭代的方式最稳妥(避免递归可能出现的栈溢出问题),我们只需要循环遍历嵌套对象,把每个层级的value收集起来就行:
const nestedObjToArr = (obj) => { const result = []; let currentObj = obj; while (currentObj) { result.push(currentObj.value); currentObj = currentObj.parent; } return result; }; // 测试还原 const originalArr = nestedObjToArr(nestedResult); console.log(originalArr); // 输出:['value1', 'value2', 'value3']
这个方法的逻辑很直观:从最外层对象开始,每次把value推入数组,然后跳到parent对象,直到currentObj变成null(也就是遍历到最内层),最后返回收集好的数组。
这两个方法的时间复杂度都是O(n),空间复杂度也是O(n),属于线性效率的最优实现,而且代码简洁易懂,完全符合ES6的风格~
内容的提问来源于stack exchange,提问作者CamDarley
相关产品推荐
相关产品推荐

