JavaScript利用闭包递归遍历树状数组菜单

作者:纸飞机时间:2026-10-27 23:48:27浏览:648

本文介绍如何使用JavaScript闭包机制递归遍历树状JSON数组。通过定义匿名函数并调用arguments.callee实现自递归,在遍历菜单项时匹配指定ID,若存在子节点则继续深入遍历,最终返回匹配的菜单名称。该方法适用于处理层级结构的菜单数据查找场景。

树状菜单数据结构与需求分析

在开发公司项目时,需要编写一个函数,该函数接收一个菜单数组集合和一个菜单ID作为参数。菜单数据以树状JSON格式存储,结构示例如下:

代码示例如下:

[{"id":28,"text":"公司信息","children":[
{"id":1,"text":"公司文化"},
{"id":2,"text":"招聘计划"},
{"id":6,"text":"公司新闻","children":[
{"id":47,"text":"行业新闻"}]},
{"id":11,"text":"内部新闻","children":[
{"id":24,"text":"行政信息"},
{"id":27,"text":"高层指示"}]},
{"id":22,"text":"联系我们"},
{"id":26,"text":"产品展示","children":[
{"id":32,"text":"电力产品"},
{"id":33,"text":"配件介绍"}}]
 }] }]

基于闭包的递归遍历逻辑

假设当前需要查找的菜单ID为32,目标是找到对应的节点并返回其菜单名称。实现思路是首先循环遍历数组,检查当前项的ID是否等于目标ID。如果相等,则提取并保存菜单名称;如果不相等,则检查当前项是否包含children属性,且该属性不为空且长度大于0。若满足条件,则遍历children数组。此时需要利用JavaScript的闭包特性,将遍历children的逻辑封装在一个匿名函数中,通过递归调用该匿名函数来深入子节点。当找到匹配的ID时,跳出循环并从主函数返回获取到的菜单名称。具体实现代码如下:

JavaScript实现代码

代码示例如下:

function getMenuName(menus, id) {
var name = "" ;
for (var i = 0; i < menus.length; i++) {
if (menus[i].id == id) {
name = menus[i].text;
break;
    }
else {
(function () {
var m = arguments[0];
var menuid = arguments[1];
for (var j = 0; j < m.length; j++) {
if (m[j].id == menuid) {
name = m[j].text;
break;
          }
else if m[j].children != null && m[j].children.length > 0) {
arguments.callee(m[j].children, val);//递归匿名方法
          }
        }
})(menus[i].children, id);
    }
  }
return name;
}
作者最新文章

相关标签: