js 一维数组转成tree 对象
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- </head>
- <body>
- <script type="text/javascript">
- function translateDataToTree(data) {
- let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
- let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
- let translator = (parents, children) => {
- parents.forEach((parent) => {
- children.forEach((current, index) => {
- if (current.parentId === parent.id) {
- let temp = JSON.parse(JSON.stringify(children))
- temp.splice(index, 1)
- translator([current], temp)
- typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
- }
- }
- )
- }
- )
- }
- translator(parents, children)
- return parents
- }
- /**
- * 该方法用于将有父子关系的数组转换成树形结构的数组
- * 接收一个具有父子关系的数组作为参数
- * 返回一个树形结构的数组
- */
- function translateDataToTree(data) {
- //没有父节点的数据
- let parents = data.filter(value => value.parentId == 'undefined' || value.parentId == null)
- //有父节点的数据
- let children = data.filter(value => value.parentId !== 'undefined' && value.parentId != null)
- //定义转换方法的具体实现
- let translator = (parents, children) => {
- //遍历父节点数据
- parents.forEach((parent) => {
- //遍历子节点数据
- children.forEach((current, index) => {
- //此时找到父节点对应的一个子节点
- if (current.parentId === parent.id) {
- //对子节点数据进行深复制,这里只支持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制
- let temp = JSON.parse(JSON.stringify(children))
- //让当前子节点从temp中移除,temp作为新的子节点数据,这里是为了让递归时,子节点的遍历次数更少,如果父子关系的层级越多,越有利
- temp.splice(index, 1)
- //让当前子节点作为唯一的父节点,去递归查找其对应的子节点
- translator([current], temp)
- //把找到子节点放入父节点的children属性中
- typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]
- }
- }
- )
- }
- )
- }
- //调用转换方法
- translator(parents, children)
- //返回最终的结果
- return parents
- }
- </script>
- </body>
- </html>
- ---------------------------------------------------------------
- /*转化函数*/
- function(data, attributes) {
- let resData = data;
- let tree = [];
- for(let i = 0; i < resData.length; i++) {
- if(resData[i][attributes.parentId] === attributes.rootId) {
- let obj = {
- id: resData[i][attributes.id],
- title: resData[i][attributes.name],
- children: []
- };
- tree.push(obj);
- resData.splice(i, 1);
- i--;
- }
- }
- run(tree);
- function run(chiArr) {
- if(resData.length !== 0) {
- for(let i = 0; i < chiArr.length; i++) {
- for(let j = 0; j < resData.length; j++) {
- if(chiArr[i].id == resData[j][attributes.parentId]) {
- let obj = {
- id: resData[j][attributes.id],
- title: resData[j][attributes.name],
- children: []
- };
- chiArr[i].children.push(obj);
- resData.splice(j, 1);
- j--;
- }
- }
- run(chiArr[i].children);
- }
- }
- }
- return tree;
- }
- 1
- var data=[{id:1,parentId:0,name:"测试1"},
- 1
- {id:2,parentId:1,name:"测试2"}]
- 1
- 2
- 3
- 4
- 5
- <em id="__mceDel"><br>let attributes = { //定义数据属性名称
- id: 'id',
- parentId: 'parentId',
- name: 'groupName',<br>rootId: 0
- }<br>/*调用*/<br>formatTreeData(data,attributes);<br></em>
js 一维数组转成tree 对象的更多相关文章
- 基于List数组转换成tree对象
package com.shjysoft.yunxi.sync.webservice; import java.util.ArrayList;import java.util.Date;import ...
- js将一个具有相同键值对的一维数组转换成二维数组
这两天,一个前端朋友在面试的笔试过程中遇到了一道类似于"用js实现将一个具有相同code值的一维数组转换成相同code值在一起的二维数组"的题目.他面试过后,把这个问题抛给了我,问 ...
- JS一维数组、多维数组和对象的混合使用
转载地址:http://blog.csdn.net/wangyuchun_799/article/details/38460515 引言 这篇文章的主要目的是讲解JavaScript数组和对象的混合使 ...
- Java第十二次作业:什么是一维数组?什么是对象数组?吃金币游戏2.0版 新增炸弹功能 新增游戏倒计时功能 新增胜利失败检测功能 使用如鹏游戏引擎制作窗体 一维数组设置金币
什么是数组? 数组的定义:是用统一的名字代表这批数据,用序号来区分各个数据.数组是无序的数据元素按有序的下标组成的集合,分配固定空间大小的一种容器. 如何理解:其实就是一个同时放很多数据的变量. a= ...
- 【php】实现多个一维数组转换成二维循环数组
1.目的:将下面类型数组转换成模板循环打印二维数组 数组库一维数组: 模板要求循环二维数组: 2.代码: header("Content-type: text/html; charset=u ...
- C# byte数组转成Bitmap对象
方法一: /// <summary> /// 将数组转换成彩色图片 /// </summary> /// <param name="rawValues" ...
- html标签内部简单加js 一维数组求最大值 最小值两个值位置和数字金字塔图形
html标签内部,简单加js <a href=""></a><!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...
- PHP多个一维数组合并成二维数组的简易方法
当我们需要进行数组遍历数据的时候,需要将多个一维数组进行二维的转换,方法很简单.如下: <?php $a= array('张三','李四','王五'); $b= array ('23','24' ...
- js一维数组转换为二维数组
function arrTrans(num, arr) { // 一维数组转换为二维数组 const iconsArr = []; // 声明数组 arr.forEach((item, index) ...
随机推荐
- 解决SublimeText 3无法安装Package Control的问题
"GOOD 解决SublimeText 3无法安装Package Control的问题 2019年4月6日Sublime Text3更新至3.2.1(BUILD 3207)版本,Sublim ...
- [題解]hdu_6412公共子序列
https://blog.csdn.net/nka_kun/article/details/81902421 #include<bits/stdc++.h> #define ll long ...
- Nginx 开启目录浏览功能配置
在server节点下添加 server { listen ; server_name default; #index index.php; # 目录浏览功能 autoindex on; # 显示文件大 ...
- AJPFX关于Collection接口的总结
###15Collection-List-ArrayList/LinkedList/* * Collection接口中的方法* A:添加功能* boolean add ...
- Oracle查询排序asc/desc 多列 order by
查询结果的排序 显示EMP表中不同的部门编号. 如果要在查询的同时排序显示结果,可以使用如下的语句: SELECT 字段列表 FROM 表名 WHERE 条件 ORDER BY 字段名1 [ASC|D ...
- Vue.js - day7
使用mui的tab-top-webview-main完成分类滑动栏 兼容问题 和 App.vue 中的 router-link 身上的类名 mui-tab-item 存在兼容性问题,导致tab栏失效, ...
- arcgis jsapi接口入门系列(6):样式
symbol: function () { //线样式 //样式详情请看官方文档 let style = { //线颜色,支持多种格式: //CSS color string:例如"dodg ...
- 最详细的github快速入门教程
一:下载github 二:安装GitHub 下载之后点击 进行安装过程,安装之后桌面上会有两个图标,如下图 三:新建项目 GitHub是图形界面模式,Git Shell是命令行模式,在Windows系 ...
- windows命令行快速启动软件
windows桌面上太多的应用程序快捷方式很影响美观,于是寻思使用类似Linux系统中命令行的方式来启动软件. 只需要3步: 1.建立一个目录A,用来存放快捷方式.比如,建立D:\path.并复制快捷 ...
- MySQL流程控制和存储过程介绍
/*定义变量方式1:set @变量名=值;方式2:select 值 into @变量名;方式3:declare 变量名 类型(字符串类型加范围) default 值; in参数 入参的值会仅在存储过程 ...