基于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 相关文章推荐
初试jQuery EasyUI 使用介绍
Apr 01 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
jquery获得页面元素的坐标值实现思路及代码
Apr 15 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
javascript中全局对象的parseInt()方法使用介绍
Dec 19 Javascript
JavaScript函数定义的常见注意事项小结
Sep 16 Javascript
jQuery中queue()方法用法实例
Dec 29 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
javascript实现一个简单的弹出窗
Feb 22 Javascript
JSONP和批量操作功能的实现方法
Aug 21 Javascript
微信小程序 首页制作简单实例
Apr 07 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简单封装了一些常用JS操作
2007/02/25 PHP
实例讲解php实现多线程
2019/01/27 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
编写简单的Python程序来判断文本的语种
2015/04/07 Python
开始着手第一个Django项目
2015/07/15 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
python实现打砖块游戏
2020/02/25 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
简历中自我评价怎么写
2014/02/12 职场文书
领导干部廉政承诺书
2014/03/27 职场文书
路政管理求职信
2014/06/18 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
创业计划书之物流运送
2019/09/17 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang