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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
2007/12/23更新创意无限,简单实用(javascript log)
Dec 24 Javascript
分享十五个最佳jQuery 幻灯插件和教程
Mar 27 Javascript
jquery foreach使用示例
Sep 12 Javascript
jquery实现鼠标悬浮停止轮播特效
Aug 20 Javascript
打造通用的匀速运动框架(实例讲解)
Oct 17 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 Javascript
用vite搭建vue3应用的实现方法
Feb 22 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
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python中协程用法代码详解
2018/02/10 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
Python同步遍历多个列表的示例
2019/02/19 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
市场专员岗位职责
2014/02/14 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
社区先进事迹材料
2014/05/19 职场文书
退伍军人感言
2015/08/01 职场文书
小学大队长竞选稿
2015/11/20 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python