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
相关产品推荐
相关产品推荐

