两个比较好用的JS方法,用来处理树形结构!
一、平级结构转树形结构
/**
* 平级结构转树形结构
*
* 示例:const jsonDataTree = listTransToTreeData(jsonData, 'id', 'pid', 'chindren');
* @param list 平级数据列表
* @param idStr id的字符串
* @param pidStr 父id字符串
* @param chindrenStr children的字符串
*/
export const listTransToTreeData = (list: any, idStr: string, pidStr: string, chindrenStr: string) => {
let r = [], hash: any = {}, id = idStr, pid = pidStr, children = chindrenStr, i = 0, j = 0, len = list.length;
for (; i < len; i++) {
hash[list[i][id]] = list[i];
}
for (; j < len; j++) {
let aVal = list[j], hashVP = hash[aVal[pid]];
if (hashVP) {
!hashVP[children] && (hashVP[children] = []);
hashVP[children].push(aVal);
} else {
r.push(aVal);
}
}
return r;
}
二、遍历树形结构并做一些处理事情
/**
* 遍历处理树形结构
* @param list 树形结构列表
* @param childName 子节点属性名,一般是children
* @param func 每个节点要执行的方法
* @param isOnlyLeaf 是否只在叶子节点执行该方法
* @param isChildCallBackFn 判断是否有children属性时执行的方法
*/
export function ergodicNodes(list: { [x: string]: any; }[],
childName: string | number,
func: (arg0: { [x: string]: any; }) => void, isOnlyLeaf: any,
isChildCallBackFn: Function) {
list.forEach((item: { [x: string]: any; }) => {
if (item[childName] && item[childName].length > 0) {
isChildCallBackFn(item);
ergodicNodes(item[childName], childName, func, isOnlyLeaf, isChildCallBackFn);
if (!isOnlyLeaf) {
for (let key in item) {
func(item)
}
return
}
} else {
for (let key in item) {
func(item)
}
return
}
})
return list;
}
ergodicNodes的用法示例
const treeList: any[] = listTransToTreeData(JSON.parse(JSON.stringify(_treeData.data)), 'id', 'pid', 'children');
// 每个节点执行的方法
const callback_fn = (item: any) => {
item.key = item.id;
item.title = item.name;
if(item.schemaName && item.pid === null) item.icon = <UserOutlined />;
if(item.schemaName && item.tableName) item.icon = <TableOutlined />;
};
// 有children属性时执行的方法
const child_callback = (item: any) => {};
const convertTree = ergodicNodes(treeList, 'children', callback_fn, false, child_callback);
setTreeData(convertTree);
两个比较好用的JS方法,用来处理树形结构!的更多相关文章
- Vue.js学习(八)—— 树形结构下拉框组件vue-treeselect
vue-treeselect是一个多选组件,具有对Vue.js的嵌套选项支持. 具有嵌套选项支持的单个和多个选择 模糊匹配 异步搜索 延迟加载(仅在需要时加载深层选项的数据) 键盘支持(使用Arrow ...
- vue.js与element-ui实现菜单树形结构
由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来总算有了解决办法.借鉴文章链接在最底部. 场景:根据业务要求,需要实现活动的树形菜单,菜单数据由后台返回,最后的效果图如 ...
- js中同一个onclick绑定了两个js方法出现的问题
问题: js中如果同一个onclick绑定了两个js方法问题,即 <li onclick="f1(),f2()"></li> 两个方法f1,f2中都分别有一 ...
- 两种js方法发起微信支付:WeixinJSBridge,wx.chooseWXPay区别
原文链接:https://www.2cto.com/weixin/201507/412752.html 1.为什么会有两种JS方法可以发起微信支付? 当你登陆微信公众号之后,左边有两个菜单栏,一个是微 ...
- 公共的强制保留两位小数的js方法
强制保留两位小数的js方法 //写一个公共的强制保留两位小数的js方法 function toDecimal2 (x) { var f = parseFloat(x) if (isNaN(f)) { ...
- 两个变量交换的四种方法(Java) 七种方法(JS)
两个变量交换的四种方法(Java) 对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) 1 class TestEV 2 ...
- JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz
iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...
- 解决同一页面中两个iframe互相调用jquery,js函数
这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: <iframe width="10 ...
- 常用js方法整理(个人)
开头总要有点废话 今天想了下,还是分享下自己平时积累的一些实用性较高的js方法,供大家指点和评价.本想分篇介绍,发现有点画蛇添足.整理了下也没多少拿得出手的方法,自然有一些是网上看到的个人觉得很有实用 ...
随机推荐
- NS2中couldn‘t read file “../tcl/mobility/scene/cbr-3-test“: no such file or directory解决方法
运行wireless.tcl 文件时报错:couldn't read file "../../uAMPS/ns-leach.tcl": no such file or direct ...
- 3.Docker常用命令
帮助启动类命令 启动docker: systemctl start docker 停止docker: systemctl stop docker 重启docker: systemctl restart ...
- 141. Linked List Cycle - LeetCode
Question 141. Linked List Cycle Solution 题目大意:给一个链表,判断是否存在循环,最好不要使用额外空间 思路:定义一个假节点fakeNext,遍历这个链表,判断 ...
- Vue2-Slot插槽使用
Slot插槽 父组件向子组件传递 父组件将内容分发到子组件 slot插槽的值只读,不能在子组件中修改 slot插槽也可以作为组件之间的通信方式 默认插槽 父组件中:使用Son组件 <templa ...
- 关于我学git这档子事(3)
对于如下报错: hint: Updates were rejected because a pushed branch tip is behind its remote hint: counterpa ...
- 广义SAM
参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串. 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树. ...
- Educatinal CF #122(Div. 2) E . Spanning Tree Queries
这一场其实有重大的意义,因为是除夕跨年,不过我FST掉大分了(ks) 题意:给你一个n点,m条边的带权图,q次询问,每次给你\(x\),每个边权为\(abs(E[i].w-x)\)答案为所有询问最小生 ...
- pytorch基础常识
- 【主流技术】Mybatis Plus的理解与应用
前言 mybatis plus是一个mybatis的增强工具,在其基础上只做增强不做改变.作为开发中常见的第三方组件,学习并应用在项目中可以节省开发时间,提高开发效率. 官方文档地址:MyBatis- ...
- IE让我首次遭受了社会的毒打
2022年6月15日,微软终止对IE的支持,自此IE走入历史,可以说这是一个时代的终结. 自己在 2011 年刚从业时,IE 在国内的市场占有率可是遥遥领先的,下图来自于 StatCounter 网站 ...