You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:41:01