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

JavaScript 如何将带层级的扁平数组反向转换为递归嵌套对象

实现方案

这个需求完全可以实现,核心思路是通过哈希表缓存所有节点的引用,避免重复递归查找父节点,时间复杂度仅为O(n),支持任意层级的嵌套转换。

完整实现代码

function convertArrToObj(iArr) {
  // 用Map存储所有节点,key为name,可实现O(1)复杂度查找父节点
  const nodeMap = new Map()
  let root = null

  // 第一次遍历:初始化所有带children属性的节点,存入Map同时找到根节点
  iArr.forEach(item => {
    const node = { ...item, children: [] }
    nodeMap.set(node.name, node)
    if (!node.parent) {
      root = node
    }
  })

  // 第二次遍历:给每个非根节点绑定到对应父节点的children数组
  iArr.forEach(item => {
    if (!item.parent) return
    const parentNode = nodeMap.get(item.parent)
    const currentNode = nodeMap.get(item.name)
    parentNode.children.push(currentNode)
  })

  // 可选步骤:如果需要和原始obj结构完全一致,可清理掉parent和level属性
  const cleanNode = (node) => {
    delete node.parent
    delete node.level
    node.children.forEach(cleanNode)
  }
  cleanNode(root)

  return root
}

调用测试

直接传入你生成的扁平数组即可得到原始嵌套对象:

const arr = [
  { name: 'entity-0', level: 0 },
  { name: 'entity-0-0', parent: 'entity-0', level: 1 },
  { name: 'entity-0-1', parent: 'entity-0', level: 1 },
  { name: 'entity-1-0', parent: 'entity-0-1', level:  2}
]
const result = convertArrToObj(arr)
console.log(result) // 输出与你提供的原始obj结构完全一致

方案说明

  • 不依赖数组的排序,就算子节点在数组中的位置早于父节点也能正常转换
  • 嵌套层级无限制,只要是通过你给出的正向转换逻辑生成的数组都可以完美还原
  • 保留了可选的属性清理逻辑,如果你业务中需要保留parent、level字段,直接删除cleanNode相关代码即可

内容的提问来源于stack exchange,提问作者SeriousLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:24:03