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 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
May 03 Javascript
javascript如何判断输入的url是否正确
Apr 11 Javascript
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
javascript制作坦克大战全纪录(1)
Nov 27 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
jQuery中的select操作详解
Nov 29 Javascript
AngularJS常见过滤器用法实例总结
Jul 06 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
深入了解Vue3模板编译原理
Nov 19 Vue.js
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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php md5下16位和32位的实现代码
2008/04/09 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
超级强大的表单验证
2006/06/26 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
学风建设演讲稿
2014/09/12 职场文书
档案管理员岗位职责
2015/02/12 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Android Studio 计算器开发
2022/05/20 Java/Android