基于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 相关文章推荐
不提示直接关闭网页窗口的JS示例代码
Dec 17 Javascript
js获取通过ajax返回的map型的JSONArray的方法
Jan 09 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
原生js简单实现放大镜特效
May 16 Javascript
vue2.X组件学习心得(新手必看篇)
Jul 05 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
使用post方法实现json往返传输数据的方法
Mar 30 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
Oct 23 jQuery
小程序实现筛子抽奖
May 26 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php登陆页的密码处理方式分享
2013/10/14 PHP
php操作xml
2013/10/27 PHP
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
javascript实现评分功能
2020/06/24 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
Python实现带百分比的进度条
2016/06/28 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
物业保安员岗位职责制度
2014/01/30 职场文书
运动会解说词200字
2014/02/06 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python