基于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 parsefloat parseint 转换函数
Jan 21 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
Apr 12 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
Nov 15 Javascript
js倒计时小实例(多次定时)
Dec 08 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
Aug 17 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
Java Varargs 可变参数用法详解
Jan 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
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
给Function做的OOP扩展
2009/05/07 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
jquery中radio checked问题
2015/03/16 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
Python 序列的方法总结
2016/10/18 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python实现猜单词小游戏
2020/05/22 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
python多线程http压力测试脚本
2019/06/25 Python
python集合常见运算案例解析
2019/10/17 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
全球虚拟主机商:HostGator
2017/02/06 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
学校班班通实施方案
2014/06/11 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
2016情人节宣传语
2015/07/14 职场文书