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

如何按menuNo合并两个菜单数组生成带子元素的父子层级菜单

实现思路

  • 先将子菜单数组(数组2)按parentMenu字段分组,生成哈希映射,键为父菜单的menuNo,值为对应子菜单的menuName数组,减少后续遍历查找的开销
  • 遍历父菜单数组(数组1),为每个父菜单匹配对应子菜单列表
  • 可根据需求过滤掉没有子菜单的父项(符合示例中去掉menuNo为1003的父菜单的要求)

完整实现代码

// 原数组1:父菜单列表
const parentMenus = [
  {
    "menuNo": "1001",
    "menuName": "All Forms",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "0",
    "childMenu": null,
    "iconName": null
  },
  {
    "menuNo": "1003",
    "menuName": "All Forms 2",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "0",
    "childMenu": null,
    "iconName": null
  },
  {
    "menuNo": "1006",
    "menuName": "All Forms 3",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "0",
    "childMenu": null,
    "iconName": null
  }
]

// 原数组2:子菜单列表
const childMenus = [
  {
    "menuNo": "1002",
    "menuName": "Child 1",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "1001",
    "childMenu": null,
    "iconName": null
  },
  {
    "menuNo": "1012",
    "menuName": "Child 2",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "1001",
    "childMenu": null,
    "iconName": null
  },
  {
    "menuNo": "1014",
    "menuName": "Child 1",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "1006",
    "childMenu": null,
    "iconName": null
  },
  {
    "menuNo": "1019",
    "menuName": "Child 2",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "1006",
    "childMenu": null,
    "iconName": null
  }
]

// 生成子菜单分组映射
const childMenuMap = childMenus.reduce((map, item) => {
  const parentNo = item.parentMenu
  if (!map[parentNo]) map[parentNo] = []
  map[parentNo].push(item.menuName)
  return map
}, {})

// 合并生成带层级的菜单结构
const mergedMenus = parentMenus.map(parent => {
  return {
    ...parent,
    childMenu: childMenuMap[parent.menuNo] || []
  }
// 过滤掉没有子菜单的父项,删除这行就会保留menuNo为1003的父菜单
}).filter(item => item.childMenu.length > 0)

console.log(JSON.stringify(mergedMenus, null, 2))

输出结果(修正了示例中错误的JSON语法,childMenu为标准数组格式)

[
  {
    "menuNo": "1001",
    "menuName": "All Forms",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "0",
    "childMenu": [
      "Child 1",
      "Child 2"
    ],
    "iconName": null
  },
  {
    "menuNo": "1006",
    "menuName": "All Forms 3",
    "groupNo": null,
    "groupName": null,
    "menuStatus": null,
    "groupStatus": null,
    "parentMenu": "0",
    "childMenu": [
      "Child 1",
      "Child 2"
    ],
    "iconName": null
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:02