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

如何改造JS数组分组函数实现按pid关联任意深度嵌套结构

改造方案

你原有实现的限制来自硬编码的多层嵌套循环,只能处理固定层级的子节点匹配。把层级匹配逻辑替换为递归调用,即可支持任意深度的嵌套场景,同时优化后的逻辑也会降低不必要的重复遍历开销。

改造后的函数代码

// 保留原有入参格式,兼容你之前的调用逻辑
const groupChildrenToParentsByKeys = (items, groupedItems, childArrayKey = 'items') => {
  return items.map(item => {
    // 查找当前节点对应的子节点集合
    const children = groupedItems[item.id]
    if (!children || children.length === 0) {
      // 无后代节点直接返回原节点
      return item
    }
    // 递归处理子节点的后代层级,再挂载到当前节点
    return {
      ...item,
      [childArrayKey]: groupChildrenToParentsByKeys(children, groupedItems, childArrayKey)
    }
  })
}

可运行完整示例

const list = [   
  { "pid": 0, "id": "solo"},
  { "pid": 0, "id": "member"},
  { "pid": 0, "id": "solo2"},
  { "pid": "member", "id": "10_admin_members"},
  { "pid": "member", "id": "10_invitations"},
  { "pid": "member", "id": "sub_member"},
  { "pid": "sub_member", "id": "other"},
  { "pid": "sub_member", "id": "other2"},
  { "pid": 0, "id": "admin"},
  { "pid": "admin", "id": "admin_general"},
  { "pid": "admin", "id": "admin_modules"},
  { "pid": "admin", "id": "admin_roles"},
  { "pid": "admin", "id": "admin_navigation"},
]

const groupChildrenToParentsByKeys = (items, groupedItems, childArrayKey = 'items') => {
  return items.map(item => {
    const children = groupedItems[item.id]
    if (!children || children.length === 0) {
      return item
    }
    return {
      ...item,
      [childArrayKey]: groupChildrenToParentsByKeys(children, groupedItems, childArrayKey)
    }
  })
}

// 原有调用逻辑无需修改
let groupedObject = _.groupBy(list, 'pid') 
let firstLevel = groupedObject[0]
let childrenParentArray = groupChildrenToParentsByKeys(firstLevel, groupedObject)
console.log(JSON.stringify(childrenParentArray, null, 2))

逻辑说明

  • 函数接收一批节点后,逐个查询每个节点对应的子节点集合
  • 如果存在子节点,就递归调用自身处理子节点的后代层级,再把处理完成的子节点数组挂载到当前节点的指定属性下
  • 没有子节点的节点直接返回,终止递归
  • 无论嵌套多少层都可以自动适配,没有层级上限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:07