转换函数

var Littlehow = {};
/**
* littlehow 2019-05-15
* 平行数据树形转换器
* @type {{format: tree.format, sort: tree.sort, map: (function(*, *): {root, da})}}
*/
Littlehow.tree = {
/**
* 将平行结果转换成树形结构,父编号不可为空,如果为最高,则可以设置root等字样
* 如果有排序字段,将排序完成后返回
* 如:data:[{id:'1', parentId:'root', name:'test'}, {id:'2', parentId:'1', name:'test1'},{id:'3', parentId:'1', name:'test2'}]
* format:{id:'id', root:'root', 'pid':'parentId', child:'children'}
* 解析后的数据形式为:
* [{id:'1','parentId':'root',name:'test', children:[{id:'2',parentId:'1',name:'test1'},{id:'3',parentId:'1',name:'test2'}]}]
* @param data -- 需要转换的数据
* @param format -- 转换格式 {id:'', root:'', pid:'', child:'', sort:{field:'', direct:1}}
* @return {*} 转换后的数据
*/
format : function(data, format) {
//如果data,没有数据,则将data原样返回
if (!data || data.length <= 0) return data;
var map = this.map(data, format);
//再遍历原数据进行树形填充
for (var i = 0, len = data.length; i < len; i++) {
var d = data[i];
if (map.dm[d[format.pid]]) {
map.dm[d[format.pid]][format.child].push(d);
}
}
//最后将root排序后返回
this.sort(map.root, format);
return map.root;
},
/**
* 平行数据映射为map
* @param data -- 平行数据
* @param format -- tree格式化信息
* @return {{d, root}} -- 返回数据和根数据map
*/
map : function(data, format) {
var dataMap = {};//全数据映射
var root = [];//根
for (var i = 0, len = data.length; i < len; i++) {
var d = data[i];
//初始化child字段,如果不想要这里初始化也可以在树形填充出进行判断初始化
d[format.child] = [];
dataMap[d[format.id]] = d;
if (data[i][format.pid] === format.root) {//将root记录到root数组
root.push(d);
}
}
return {dm : dataMap, root : root};
},
/**
* 进行排序 format.sort格式为sort:{field:'', direct:1},其中direct=1为正序,direct=-1为逆序
* @param result -- 结果集
* @param format -- 格式化
*/
sort : function(result, format) {
if (!format.sort) return;//没有排序配置则不进行排序
result.sort(function(a, b) {
var as = a[format.sort.field];
var bs = b[format.sort.field];
return (as - bs) * format.sort.direct;
});
//如果result中有child,则继续进行排序
for (var i = 0, len = result.length; i < len; i++) {
if (result[i][format.child].length > 0) {
this.sort(result[i][format.child], format);
}
}
}
};

  

调用示例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tree case</title>
<script src="TreeUtils.js" type="application/javascript"></script>
<script type="application/javascript">
var data = [
{
"menuName": "系统管理",
"parentId": "root",
"iconCls": "el-icon-s-tools",
"request": null,
"leaf": "0",
"sortNo": 30,
"menuId": "1"
},
{
"menuName": "人员管理",
"parentId": "1",
"iconCls": null,
"request": "/system/user",
"leaf": "1",
"sortNo": 3,
"menuId": "2"
},
{
"menuName": "角色管理",
"parentId": "1",
"iconCls": null,
"request": "/system/role",
"leaf": "1",
"sortNo": 6,
"menuId": "3"
},
{
"menuName": "菜单管理",
"parentId": "1",
"iconCls": null,
"request": "/system/menu",
"leaf": "1",
"sortNo": 9,
"menuId": "4"
},
{
"menuName": "系统配置",
"parentId": "1",
"iconCls": null,
"request": "/system/config",
"leaf": "1",
"sortNo": 12,
"menuId": "5"
},
{
"menuName": "字典管理",
"parentId": "1",
"iconCls": null,
"request": "/system/dictionary",
"leaf": "1",
"sortNo": 15,
"menuId": "6"
},
{
"menuName": "内容管理",
"parentId": "root",
"iconCls": "el-icon-tickets",
"request": null,
"leaf": "0",
"sortNo": 18,
"menuId": "21"
},
{
"menuName": "banner",
"parentId": "21",
"iconCls": null,
"request": "/content/banner",
"leaf": "1",
"sortNo": 3,
"menuId": "22"
},
{
"menuName": "公告列表",
"parentId": "21",
"iconCls": null,
"request": "/content/attention",
"leaf": "1",
"sortNo": 9,
"menuId": "23"
},
{
"menuName": "App版本管理",
"parentId": "root",
"iconCls": "el-icon-tickets",
"request": null,
"leaf": "0",
"sortNo": 27,
"menuId": "91"
},
{
"menuName": "App版本管理",
"parentId": "91",
"iconCls": null,
"request": "/app/manager",
"leaf": "1",
"sortNo": 3,
"menuId": "92"
}
]; var format = {
id:'menuId', //菜单编号,作为树形查找id
root:'root', //顶层节点的parentId是root
pid:'parentId',//父节点标识字段为parentId
child:'children',//构造出的树形子节点数组名为children
sort:{field:'sortNo', direct:1}};//排序字段为sortNo,且正序 var result = Littlehow.tree.format(data, format);
console.log(result);
document.write(JSON.stringify(result));
</script>
</head>
<body> </body>
</html>

  

输出结果如下

[{
"menuName": "内容管理",
"parentId": "root",
"iconCls": "el-icon-tickets",
"request": null,
"leaf": "0",
"sortNo": 18,
"menuId": "21",
"children": [{
"menuName": "banner",
"parentId": "21",
"iconCls": null,
"request": "/content/banner",
"leaf": "1",
"sortNo": 3,
"menuId": "22",
"children": []
}, {
"menuName": "公告列表",
"parentId": "21",
"iconCls": null,
"request": "/content/attention",
"leaf": "1",
"sortNo": 9,
"menuId": "23",
"children": []
}]
}, {
"menuName": "App版本管理",
"parentId": "root",
"iconCls": "el-icon-tickets",
"request": null,
"leaf": "0",
"sortNo": 27,
"menuId": "91",
"children": [{
"menuName": "App版本管理",
"parentId": "91",
"iconCls": null,
"request": "/app/manager",
"leaf": "1",
"sortNo": 3,
"menuId": "92",
"children": []
}]
}, {
"menuName": "系统管理",
"parentId": "root",
"iconCls": "el-icon-s-tools",
"request": null,
"leaf": "0",
"sortNo": 30,
"menuId": "1",
"children": [{
"menuName": "人员管理",
"parentId": "1",
"iconCls": null,
"request": "/system/user",
"leaf": "1",
"sortNo": 3,
"menuId": "2",
"children": []
}, {
"menuName": "角色管理",
"parentId": "1",
"iconCls": null,
"request": "/system/role",
"leaf": "1",
"sortNo": 6,
"menuId": "3",
"children": []
}, {
"menuName": "菜单管理",
"parentId": "1",
"iconCls": null,
"request": "/system/menu",
"leaf": "1",
"sortNo": 9,
"menuId": "4",
"children": []
}, {
"menuName": "系统配置",
"parentId": "1",
"iconCls": null,
"request": "/system/config",
"leaf": "1",
"sortNo": 12,
"menuId": "5",
"children": []
}, {
"menuName": "字典管理",
"parentId": "1",
"iconCls": null,
"request": "/system/dictionary",
"leaf": "1",
"sortNo": 15,
"menuId": "6",
"children": []
}]
}]

  

javascript将平行的拥有上下级关系的数据转换成树形结构的更多相关文章

  1. js将有父子关系的数据转换成树形结构数据

    js将有父子关系的数据转换成树形结构数据 比如如下基本数据: let allDatas = [ { id: 3, name: 'bbbb', parendId: 1 }, { id: 2, name: ...

  2. Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级

    在平时的开发工作中,经常遇到这样一个场景,在数据库中存储了具有父子关系的数据,需要将这些数据以树形结构的形式在界面上进行展示.本文的目的是提供了一个通用的编程模型,解决将具有父子关系的数据转换成树形结 ...

  3. JS 将有父子关系的数组转换成树形结构数据

    将类似如下数据转换成树形的数据 [{ id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1', ...

  4. dtree实现上下级关系的显示

    在实际开发中我们常常要涉及到到在页面上显示上下级关系这样的需求 ,我的实现方法: 环境:S2SH+mysql 数据库结构如下图: 其中mgr字段是指经理,也就是自己的上一级 映射信息: Action和 ...

  5. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  6. 20170907VS中EF模型文件.edmx文件上下级关系丢失问题

    状态:A 电脑check in .edmx文件到TFS ,B 电脑vs下载如下文件 vs解决方案中此文件平级显示,原因:ADO.NET 数据模型创建的时候,会在工程文件 .csproj内增加文件层级关 ...

  7. sql上下级关系查询

    有一张存在上下级关系的function表,parentId表示上级Id,现要查询出上级菜单下的子菜单,每个子菜单显示成以逗号分隔的字符串 表结构如下: create table menu ( id i ...

  8. javascript eval和JSON之间的关系

    eval函数的工作原理 eval函数会评估一个给定的含有javascript代码的字符串,并且视图去执行包含在字符串里的表达式或者 一系列的合法的javascript语句.eval函数将把最后一个表达 ...

  9. JavaScript 构造树形结构的一种高效算法

    引言 我们经常会碰到树形数据结构,比如组织层级.省市县或者动植物分类等等数据.下面是一个树形结构的例子: 在实际应用中,比较常见的做法是将这些信息存储为下面的结构,特别是当存在1对多的父/子节点关系时 ...

随机推荐

  1. maven添加代理,默认的.m2路径

    Maven设置http代理 编辑~/.m2/settings.xml文件,添加如下配置 找到 <proxies> 节点.去掉相应的注释,设置代理信息如下: 1 <proxy> ...

  2. 【JAVA】笔记(6)--- toString方法;equals方法;finalize方法;package与import;内部类;

    toString: 1.每创建一个类时,都要重写 toString 方法,这是敲代码的基本素养: 2.重写规则:简单明了: 3.String 类中也有toString方法(SUN公司写的): equa ...

  3. <C#任务导引教程>练习一

    //1,定位显示ASCI码值为30到119的字符using System;class Program{    static void Main()    {        int i, n = 0;  ...

  4. 自定义 OpenShift s2i 镜像与模板——OracleJDK8

    本文目标 由于 OpenShift 官方提供的镜像与模板(OpenJDK8)不完全满足业务需要: 不包含飞行记录功能.只有 OpenJDK11 以上才被 Oracle 开源 生成堆 dump 很大很慢 ...

  5. [cf1427E]Xum

    假设$x$的最高位为$2^{t}$(即$2^{t}\le x<2^{t+1}$),并构造出$y=2^{t}x\oplus x$,不难发现两者仅在第$t$位上均为1,那么根据异或的性质可得$y=( ...

  6. [hdu7011]被EI加0了

    注意到仅关心于权值大小,预处理出$F_{i}(n)$​​​​表示$a_{1},a_{2},...,a_{n}$​​​​中恰填$i$​​​​​​种不同的数的方案数,那么显然答案即为$\sum_{i=1} ...

  7. 了解Threejs中的Clock对象以及简单应用

    什么是Clock对象 如果你对 JavaScript 有一定了解,那么 JavaScript 的时间对象 Date 你一定不陌生,Clock 本质上就是对 Date 进行封装,提供了一些方法和属性 当 ...

  8. NOI2020 同步赛划水记

    因为太菜了没去现场参加 NOI 就算去了估计也只能混个Fe(雾) "两天都会各有一道签到题,争取拿到70分.剩下的题每道题打30分暴力.每天130分,就能稳拿Ag了."--ls D ...

  9. 洛谷 P7323 - [WC2021] 括号路径(启发式合并)

    题面传送门 emmmm----怎么评价这个题嘛...感觉纯论算法,此题根本谈不上难题,不过 WC 时候太智障只拿了个 48pts 就走人了.总之,技不如人,甘拜吓疯( 首先要注意到几件事情: 如果 \ ...

  10. 洛谷 P7620 - CF1431J Zero-XOR Array(状压 dp)

    洛谷题面传送门 首先显然题目等价于求有多少个长度 \(n-1\) 的序列 \(b\) 满足 \(a_i\le b_i\le a_{i+1}\),满足 \(b_1\oplus b_2\oplus\cdo ...