基于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 相关文章推荐
禁止F5等快捷键的JS代码
Mar 06 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
js实时获取系统当前时间实例代码
Jun 28 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
Mar 10 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
JavaScript中的工厂函数(推荐)
Mar 08 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
JavaScript实现区块链
Mar 14 Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
微信小程序实现搜索框功能及踩过的坑
Jun 19 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多任务程序实例解析
2014/07/19 PHP
php返回json数据函数实例
2014/10/09 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现爬取图书封面
2018/07/05 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
Python如何实现单例模式
2016/06/03 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
如何唤起类中的一个方法
2013/11/29 面试题
五一促销活动总结
2014/07/01 职场文书
美术专业自荐信
2014/07/07 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
中标通知书范本
2015/04/17 职场文书
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android