基于JavaScript实现树形下拉框


Posted in Javascript onAugust 10, 2016

平时会经常遇到树形结构的问题,比如显示目录结构等。

大多数情况下后台会返回这样的数据,如下:

[
{ id: 19, pid: 0, name: 'nodejs' },
{ id: 20, pid: 19, name: 'express' },
{ id: 21, pid: 19, name: 'mongodb' },
{ id: 60, pid: 20, name: 'ejs' },
{ id: 59, pid: 0, name: '前端开发' },
{ id: 70, pid: 59, name: 'javascript' },
{ id: 71, pid: 59, name: 'css' },
{ id: 72, pid: 59, name: 'html' },
{ id: 73, pid: 59, name: 'bootstrap' },
{ id: 61, pid: 0, name: '视觉设计' },
{ id: 63, pid: 61, name: '网页设计' },
]

这种数据结构后台容易处理,但是前台不好处理,需要首先将其转成树形json数据,如下:

[
{ id: 19, pid: 0, name: 'nodejs',
 children:[
   { id: 20, pid: 19, name: 'express',children:[{ id: 60, pid: 20, name: 'ejs' }]},
   { id: 21, pid: 19, name: 'mongodb' }
   ]
},
{ id: 59, pid: 0, name: '前端开发',
 children:[
  { id: 70, pid: 59, name: 'javascript' },
  { id: 71, pid: 59, name: 'css' },
  { id: 72, pid: 59, name: 'html' },
  { id: 73, pid: 59, name: 'bootstrap' }
   ]
},
{ id: 61, pid: 0, name: '视觉设计',children:[{ id: 63, pid: 61, name: '网页设计' }]},
]

这样就可以很方便的是用递归构建树形的组件。

如果后台能够直接返回这种结构最好,不然前台需要做转换。

一、将list数组结构的数据转成tree结构json

//list 转成树形json
function listToTree(list,pid) {
var ret = [];//一个存放结果的临时数组
for(var i in list) {
if(list[i].pid == pid) {//如果当前项的父id等于要查找的父id,进行递归
 list[i].children = listToTree(list, list[i].id);
 ret.push(list[i]);//把当前项保存到临时数组中
}
}
return ret;//递归结束后返回结果
}

var tree=listToTree(list,0);//调用函数,传入要转换的list数组,和树中顶级元素的pid

console.log(tree);

二、根据tree结构json数据生成下拉框

//在网页中添加下拉框容器
<select id="selectbox" name=""></select>
//js脚本,递归生成
//获取容器对象
var selectbox=document.getElementById("selectbox");

//生成树下拉菜单
var j="-";//前缀符号,用于显示父子关系,这里可以使用其它符号
function creatSelectTree(d){
 var option="";
 for(var i=0;i<d.length;i++){
 if(d[i].children.length){//如果有子集
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
 j+="-";//前缀符号加一个符号
  option+=creatSelectTree(d[i].children);//递归调用子集
 j=j.slice(0,j.length-1);//每次递归结束返回上级时,前缀符号需要减一个符号
  }else{//没有子集直接显示
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
  }
  }
 return option;//返回最终html结果
 }

//调用函数,并将结构出入到下拉框容器中
selectbox.innerHTML=creatSelectTree(tree);

如果大家还想深入学习,可以点击jquery下拉框效果汇总、JavaScript下拉框效果汇总进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
关于文本框的一些限制控制总结~~
Apr 15 Javascript
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
js实现图片和链接文字同步切换特效的方法
Feb 20 Javascript
js实现固定显示区域内自动缩放图片的方法
Jul 18 Javascript
jQuery自定义滚动条完整实例
Jan 08 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
详解前端自动化工具gulp自动添加版本号
Dec 20 Javascript
pm2 部署 node的三种方法示例
Oct 20 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
Jan 16 Javascript
如何用Node写页面爬虫的工具集
Oct 26 Javascript
vue-cli3+typescript初体验小结
Feb 28 Javascript
关于原生js中bind函数的简单实现
Aug 10 #Javascript
Mvc提交表单的四种方法全程详解
Aug 10 #Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 #Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
Aug 10 #Javascript
浅谈jQuery中的checkbox问题
Aug 10 #Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 #Javascript
Three.js学习之网格
Aug 10 #Javascript
You might like
PHP初学者头疼问题总结
2006/07/08 PHP
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
PHP 递归效率分析
2009/11/24 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
phpfpm的作用和用法
2019/10/10 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
Python内置函数OCT详解
2016/11/09 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
shell的种类有哪些
2015/04/15 面试题
简历中自我评价怎么写
2014/02/12 职场文书
教师党员一句话承诺
2014/03/28 职场文书
结对共建工作方案
2014/06/02 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
计算机教师工作总结
2015/08/13 职场文书
高一英语教学反思
2016/03/03 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python
Redis性能监控的实现
2021/07/09 Redis
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL