js把树形数据转成扁平数据

我就直接上代码了都是实际项目里面用到的

1.假设这个json就已经是树型结构数据了(如果不知道怎么实现树型结构数据请看我另一篇博客
var compressedArr=afcommon.treeDataToCompressed(json);

/*******************************JS封装好的方法*********************************************/
var afcommon=(function ($) {    var prefix="|—";    let compressedData=[];// 用于存储递归结果(扁平数据)    return {

        /**         * 把扁平数据转成树型结构数据(可以实现无限层级树形数据结构,只适用于单个表的数据)         * @param source         * @param id         * @param parentId         * @param children         */        treeDataformat : function(source, id, parentId, children){            let cloneData = JSON.parse(JSON.stringify(source));  // 对源数据深度克隆            return cloneData.filter(father=>{    // 循环所有项,并添加children属性                let branchArr = cloneData.filter(child => father[id] == child[parentId]);  // 返回每一项的子级数组                branchArr.length>0 ? father[children] = branchArr : ‘‘             //给父级添加一个children属性,并赋值                return father[parentId] == 0        // 如果第一层不是parentId=0,请自行修改            })        },        /**         * 把树型结构数据转成扁平数据(跟treeDataformat方法相反)         * @param source         */        treeDataToCompressed :function (source) {            for(let i in source) {                compressedData.push(source[i]);                source[i].children && source[i].children.length>0 ? this.treeDataToCompressed(source[i].children) : ""// 子级递归            }            return compressedData;        },        /**         * 递归生成 树下拉菜单         * @param JsonTree 此参数已经是树型结构的数据了 如:JsonTree[{"id": "0","value":"测试","children": []}]         * @param typeId         * @param name         * @returns {string}         */        creatSelectTree : function(JsonTree,typeId,name){//js脚本,递归生成 树下拉菜单            var option="";            for(var i=0;i<JsonTree.length;i++){                if(JsonTree[i].children!= undefined && JsonTree[i].children.length>0){//如果有子集                    option+="<option value=‘"+JsonTree[i][typeId]+"‘>"+prefix+JsonTree[i][name]+"</option>";                    prefix+="|—";//前缀符号加一个符号                    option+=this.creatSelectTree(JsonTree[i].children,typeId,name);//递归调用子集                    prefix=prefix.slice(0,prefix.length-2);//每次递归结束返回上级时,前缀符号需要减一个符号                }else{//没有子集直接显示                    option+="<option value=‘"+JsonTree[i][typeId]+"‘>"+prefix+JsonTree[i][name]+"</option>";                }            }            return option;//返回最终html结果        },        /**         * 适用于layer.confirm   动态改变title 多语言切换         * layer.confirm(msg,{titel:‘Message‘},{btn: [‘确定‘,‘取消‘]}, function () {},function () {})      (这样写改变title 好像会对后面的回调函数有影响,不信你试试)         * @param title         * @param index         */        changeLayerTitle: function (title,index) {            return layer.title(title, index)        },    }})(jQuery);

测试结构:

好的东西就要懂得分享,推荐一个写的好的博客一个字来形容———厉害!

https://blog.csdn.net/Mr_JavaScript/article/details/102833991

原文地址:https://www.cnblogs.com/time1997/p/12228506.html

时间: 2024-10-12 16:06:36

js把树形数据转成扁平数据的相关文章

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN model m 4 ON am.modelId = m.modelId 5 ORDER BY am.activeId 查询出的列表为图1所示: 图1 修改过后的sql语句,查询后如图2所示: 1 SELECT

C# 泛型List对象数据 导出 成 EXCEL数据表

1          /// <summary>  2         /// 将一组对象导出成EXCEL  3         /// </summary>  4         /// <typeparam name="T">要导出对象的类型</typeparam>  5         /// <param name="objList">一组对象</param>  6         //

js如何把字符串转换成json数据的方法

function strtojson(str){ var json = eval('(' + str + ')'); return json; } 方法二 function strtojson(str){ var json = (new function("return " + str))(); return json; } 方法三 function strtojson(str){ return json.parse(str); }

oracle查询多行数据合并成一行数据

如果是oracle 10g以上 一个wm_concat函数就可以解决. 如果是oracle 9i以下就有点麻烦了. 表结构如下: NAME Null Type ------------------------ --------- ----- N_SEC_CODE NOT NULL CHAR(6) C_RESEARCHER_CODE NOT NULL VARCHAR2(20) 此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员 对其进行跟踪研究.所以目前遇

SQLServer 中多行数据合并成一行数据(一个字段)

需求:有四行数据,如下: 1.苹果 2.橘子 3.桃子 4.波罗 合并成一个字段:苹果,橘子,桃子,波罗: 需求明确之后,先弄点测试数据,上代码: --创建一个临时表 Create table #temp ( testName varchar(20) ) --写入测试数据 INSERT INTO #temp(testName) values('苹果'); INSERT INTO #temp(testName) values('橘子'); INSERT INTO #temp(testName) v

Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题

1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具,从10g开始,不仅保留了原有的EXP和IMP工具,还提供了数据泵导出导入工具EXPDP和IMPDP.所以在11G的倒库和入库方式中,我们也有两种方式可以选择:传统模式和数据泵模式. 传统模式又分为:常规导入导出和直接导入导出. 下面以导出数据为例,分别介绍各自导出原理. 1.1简述各导入导出方式的原理 1.1.1常规导出原理 传统路径模式使用SQL SELECT语句抽取表数据.数据从磁盘读入到buffer cache缓冲区中

JS:字符串转成json数据,和json转成字符串方法 iframe获取父级传过来的数据

字符串转成json数据,和json转成字符串方法 //转为JSON adinfo=JSON.parse(adinfo) //转为字符串 adinfo=JSON.stringify(adinfo) 大概流程: var gdt_adinfo=[]; 父级页面通过接口获取的数据: this.url="http://gjs.adwo.com/gjs/gad_i?sdkVersion="+sdkVersion+"&n=1&gp="+gp; 获取数据后处理的方法

js实现关于数据字典的使用和数据存放的策略

项目中的页面经常会和数据字典的值进行查询,一个一个去用ajax去请求,无疑很浪费时间,当时我的想法是做一个js的工具类,里面放这么几个方法, 1.getAll()                         //用ajax获得所有数据 2.findTypeData(type)    //按type把数据查询出来 3.findNameById(type,id)          //按type和id得到汉字的值 经过一段时间的使用,确实方便了挺多,但是,每次加载页面时都要去getAll()一下

SpringMVC中出现&quot; 400 Bad Request &quot;错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法 今天开发过程中,在SpringMVC中的Action中处理前台ajax请求传过来的json数据直接转成对应的实体类时出错:400 Bad Request,后台也不报错,400指的的是请求无效(请求有语法问题或者不能满足请求),调试了好长时间