js实现树级递归,通过js生成tree树形菜单(递归算法)
方法封装:
/**
* 数据转换为树形(递归),示例:toTreeByRecursion(source, 'id', 'parentId', null, 'children')
* @param {Array} source 数据
* @param {String} idField 标识字段名称
* @param {String} parentIdField 父标识字段名称
* @param {Any} parentIdNoneValue 父级标识空值
* @param {String} childrenField 子节点字段名称
* @param {Object} treeOption tree树形配置
*/function toTreeByRecursion (
source = [],
idField = 'id',
parentIdField = 'parentId',
parentIdNoneValue = '',
childrenField = 'children',
treeOption = undefined
) {
const treeOptions = {
enable: false, // 是否开启转tree插件数据
keyField: 'key', // 标识字段名称,默认为key
valueField: 'value', // 值字段名称,默认为value
titleField: 'title', // 标题字段名称,默认为title keyFieldBind: 'id', // 标识字段绑定字段名称,默认为id
valueFieldBind: 'id', // 值字段名称绑定字段名称,默认为id
titleFieldBind: 'name' // 标题字段名称绑定字段名称,默认为name
}
// 合并tree树形配置
if (treeOption) {
Object.assign(treeOptions, treeOption)
} // 对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(source))
return cloneData.filter(parent => {
// 返回每一项的子级数组
const branchArr = cloneData.filter(child => parent[idField] === child[parentIdField]) // 绑定tree树形配置
if (treeOptions.enable) {
branchArr.map(child => {
child[treeOptions.keyField] = child[treeOptions.keyFieldBind]
child[treeOptions.valueField] = child[treeOptions.valueFieldBind]
child[treeOptions.titleField] = child[treeOptions.titleFieldBind]
return child
})
} // 如果存在子级,则给父级添加一个children属性,并赋值,否则赋值为空数组
if (branchArr.length > 0) {
parent[childrenField] = branchArr
} else {
parent[childrenField] = []
} // 绑定tree树形配置
if (treeOptions.enable) {
parent[treeOptions.keyField] = parent[treeOptions.keyFieldBind]
parent[treeOptions.valueField] = parent[treeOptions.valueFieldBind]
parent[treeOptions.titleField] = parent[treeOptions.titleFieldBind]
} return parent[parentIdField] === parentIdNoneValue // 返回第一层
})
}
使用示例:
var jsonData = [
{
id: '1',
name: '1',
parentId: null,
rank: 1
},
{
id: '2',
name: '1-1',
parentId: '1',
rank: 1
},
{
id: '3',
name: '1-2',
parentId: '1',
rank: 1
}, {
id: '4',
name: '2',
parentId: null,
rank: 1
},
{
id: '5',
name: '2-1',
parentId: '4',
rank: 1
},
{
id: '6',
name: '2-2',
parentId: '4',
rank: 1
},
{
id: '7',
name: '2-2-1',
parentId: '6',
rank: 1
}
]
const treeOption = {
enable: false, // 是否开启转tree插件数据
keyField: 'key', // 标识字段名称
valueField: 'value', // 值字段名称
titleField: 'title', // 标题字段名称 keyFieldBind: 'id', // 标识字段绑定字段名称
valueFieldBind: 'id', // 值字段名称绑定字段名称
titleFieldBind: 'name' // 标题字段名称绑定字段名称
}
const treeData = toTreeByRecursion(jsonData, 'id', 'parentId', null, 'children', treeOption)
console.log(treeData)

说明:
- parentIdNoneValue 父级标识空值这个参数如果跟你数据无父级时的值不一致时,就配置这个参数。比如:这里默认值为null,你根节点parentId的值为-1或''。
- treeOption 参数可以不传,如果要绑定tree树形控件(一般都会有key、value、title这三个字段),那就需要配置这个参数,如果参数默认的配置跟你的不一样,那就通过参数覆盖的方式重新定义。
- treeOption 的三个绑定字段是指绑定你数据中的字段,实质就是把原数据字段绑定的tree树形控件需要的三个字段key、value、title。
- 想到了再补充。。。
js实现树级递归,通过js生成tree树形菜单(递归算法)的更多相关文章
- js模仿块级作用域(js没有块级作用域私有作用域)
js模仿块级作用域(js没有块级作用域私有作用域) 一.总结 1.js没有块级作用域:在for循环中定义的i,出了for循环还是有这个i变量 2.js可以模拟块级作用域:用立即执行的匿名函数:(匿名函 ...
- 菜鸟笔记:node.js+mysql中将JSON数据构建为树(递归制作树状菜单数据接口)
初学Web端开发,今天是第一次将所学做随笔记录,肯定存在多处欠妥,望大家海涵:若有不足,望大家批评指正. 进实验室后分配到的第一个项目,需要制作一个不确定层级树形菜单的数据接口,对于从来没实战编过程的 ...
- js无限级树菜单
以前做网站,树形菜单一般都很简单,自己定义风格样式,简单的js控制,后来原来网上很多文章都在讨论Js树型菜单,看了几个实例,发现这个树比较简单好用. http://hovertree.com/texi ...
- 用Vue.js递归组件构建一个可折叠的树形菜单
在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', { template: `<!--Invoking myself! ...
- Vue.js递归组件实现动态树形菜单
使用Vue递归组件实现动态菜单 现在很多项目的菜单都是动态生成的,之前自己做项目也是遇到这种需求,翻看了官网案例,和网上大神的案例.只有两个感觉,官网的案例太简洁,没有什么注释,看起来不太好理解,大神 ...
- Vue.js 递归组件实现树形菜单
最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...
- 6个函数的output看JS的块级作用域
1. var output = 0; (function() { output++; }()); console.log(output); 函数对全局的output进行操作,因为JS没有块级作用域,所 ...
- 下拉的DIV+CSS+JS二级树型菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JQuery 树状结构 jQuery-treeview.js 插件
由简入繁实现Jquery树状结构 在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一 ...
随机推荐
- PHP dechex() 函数
实例 把十进制转换为十六进制: <?phpecho dechex("30") . "<br>";echo dechex("10&qu ...
- 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令
这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似 ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
- C++的常用输入及其优化以及注意事项
$\mathcal{P.S:}$ 对于输入方式及其优化有了解的大佬可直接阅读$\mathcal{Part}$ $\mathcal{2}$ 特别鸣谢:@归斋目录: $\mathcal{Part}$ $\ ...
- 细说selenium的等待条件
selenium的显示等待 在进行UI自动化测试的时候,我们为了保持用例的稳定性,往往要设置显示等待,显示等待就是说明确的要等到某个元素的出现或者元素的某些条件出现,比如可点击.可见等条件,如果在规定 ...
- ASP.NET中使用Cache类来缓存页面的信息
实现 如果将数据保存在全局应用程序对象Application中,值将会在程序运行时一直存在,而我们只需要缓存一段时间. ASP.NET提供了一个Cache对象来执行对象数据的缓存. Cache对象是S ...
- kubernetes 中安装 heapster 问题
step1: 在官网下载部署文件 https://github.com/kubernetes-retired/heapster/tree/master/deploy/kube-config/influ ...
- 群晖系统如何通过Video Station套件管理NAS中的视频
一.PC端观看视频 1.在NAS套件中心找到Video Station套件,安装套件 2.设置video套件别名,便于后期使用,控制面板----应用程序门户----video Station 3.选中 ...
- 在龙芯mips64el平台编译bmon
bmon 是一个 实时命令行流量监控软件,但作者在github并没有提供mips64el的版本.下面记录一下编译过程.可以在这里下载bmon.v4.0.linux-mips64el.tar.gz. 环 ...
- ~/.ssh/目录找不到解决方法
执行 cd ~/.ssh发现.ssh目录找不到 原因是因为没有用root用户ssh登录过,执行一下ssh操作就会自动生成了