js用闭包遍历树状数组的方法


Posted in Javascript onMarch 19, 2014

做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单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,如果children不为空且数量大于0,则遍历children,这时就要用到javascript的闭包,将遍历children的方法放在一个匿名方法中,这样一直在匿名方法中递归自身,当遇到相同名称的id,就跳出循环,然后从主方法中返回得到的菜单名称,代码如下:

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;
}
Javascript 相关文章推荐
表单提交验证类
Jul 14 Javascript
js实现简单模态窗口,背景灰显
Nov 14 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
jQuery ajax实现省市县三级联动
Mar 07 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
Apr 25 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
Vue中全局变量的定义和使用
Jun 05 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
Vue+Node实现的商城用户管理功能示例
Dec 23 Javascript
vue使用require.context实现动态注册路由
Dec 25 Vue.js
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 #Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 #Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 #Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
Mar 18 #Javascript
js身份证判断方法支持15位和18位
Mar 18 #Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 #Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 #Javascript
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP运行模式的深入理解
2013/06/03 PHP
php实现简单洗牌算法
2013/06/18 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
js DOM的学习笔记
2011/12/22 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python语言中with as的用法使用详解
2018/02/23 Python
Django配置跨域并开发测试接口
2020/11/04 Python
举例讲解Python装饰器
2020/12/24 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
C#面试问题
2016/07/29 面试题
客服工作职责
2013/12/11 职场文书
道德与公民自我评价
2015/03/09 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
会议营销主持词
2015/07/03 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
公司车队管理制度
2015/08/04 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS