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 相关文章推荐
超简单JS二级、多级联动的简单实例
Feb 18 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
Mar 05 Javascript
js实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
基于jQuery实现左右图片轮播(原理通用)
Dec 24 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
Vue中使用vux的配置详解
May 05 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
如何使用puppet替换文件中的string
Dec 06 Javascript
微信小程序实现随机验证码功能
Dec 20 Javascript
JS出现404错误原理及解决方案
Jul 01 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
PHP基础知识介绍
2013/09/17 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
DTD的含义以及作用
2014/01/26 面试题
工作自我评价怎么写
2014/01/29 职场文书
优秀家长自荐材料
2014/08/26 职场文书
超强台风观后感
2015/06/09 职场文书
python执行js代码的方法
2021/05/13 Python
Python的这些库,你知道多少?
2021/06/09 Python