热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javascript封装树数据处理插件treejs

 我们在做项目的时候经常会遇到管誉组织、部分、分类、等树结构的数据,在数据结构里面算是复杂类型的数据,处理起来会有点麻烦,一般都会使用到递归,最近自己在做项目的时候页遇到类似的需求,于是自己花了

 我们在做项目的时候经常会遇到管誉组织、部分、分类、等树结构的数据,在数据结构里面算是复杂类型的数据,处理起来会有点麻烦,一般都会使用到递归,最近自己在做项目的时候页遇到类似的需求,于是自己花了点时间封装了一个专门处理树数据的小插件,里面集成了一些常见的树处理方法,可以直接调用使用。代码不到300行,小巧易用,由于本人水平有限,可能写的不是很好,或者有些小bug,欢迎各位在使用过程中遇到问题指正错误,或者有更好的想法都可以留言交流。代码已经上传到gitee上了,有时间或者新的功能我会更新上去。欢迎下载使用。

TREEJS专门用于处理树数据的插件,包含创建树、新增节点、修改节点、删除节点、查询节点、获取节点层级等常见功能,插件小巧易用。

 

调用:

const OBJ = new $TREE('pid', 'children', 'name', 0);
let tree = OBJ.create(db);
console.log('树数据==', tree);
console.log('tree数据==', OBJ.sortTreeNodeChildrenByKey(tree, 2, 'name'));
let parentNode = OBJ.getParentNode(tree, 5);
console.log('父节点node==', parentNode);
let node = OBJ.getTreeNodeById(tree, 5);
console.log('节点node==', node);
let level = OBJ.getLevelNode(tree, 5);
console.log('层级节点node==', level);
OBJ.setTreeNodeValue(tree, 5, 'zyc', [1, 2, 3, 4]);
console.log('设置节点node==', tree);
let value = OBJ.getTreeNodeValueByKey(tree, 5, 'zyc');
console.log('获取节点node-value==', value);
OBJ.delTreeNodeKey(tree, 5, 'zyc');
console.log('删除key的树节点数据==', tree);
OBJ.appendChildrenNode(tree, 5, {id: 3232, pid: 21, name: '新增子节点1'});
OBJ.appendChildrenNode(tree, 5, {id: 4324, pid: 21, name: '新增子节点2'});
console.log('删除key的树节点数据==', tree);
OBJ.clearChildrenNode(tree, 5);
console.log('清空树子节点数据==', tree);
let nodeLevel = OBJ.getNodeLevel(tree, 5);
console.log('树节点层级==', nodeLevel);
let childrens = OBJ.getParentNodes(tree, 5);
console.log('树节子子节点==', childrens);

运行结果如下:

下载地址: csdn下载地址

码云地址:treejs

源码如下:

((w) => {
let $TREE = w.$TREE;
if (!w.$TREE) {
w.$TREE = {};
}
// 排序函数
function objSortBykey(objArr, key) {
let result = objArr.slice(0);
return result.sort((a, b) => a[key] - b[key]);
}
function TREEOBJ (pidKey, childrenKey, label, topPid) {
// 对象主体
this.pidKey = pidKey; // 所属父节点id key
this.topPid = topPid; // 顶级父节点id
this.childrenKey = childrenKey; // 子节点children
this.label = label; // 节点labe 的key值
// data 传进的树数据列表 pidKey 所属父级id对应的key值
this.create = function (data, pidKey = this.pidKey, pid) {
pid = pid || this.topPid; // 0为最高父级节点父id
let list = [];
data.map(item => {
if (item[pidKey] == pid) {
item[childrenKey] = this.create(data, pidKey, item.id);
list.push(item);
}
});
return list;
};
// 将树型结构数据处理成二位数组返回
this.getTreeDataList = function (data) {
const res = [];
function getData(data) {
data.forEach(v => {
res.push(v);
if (v[childrenKey]) {
getData(v[childrenKey]);
}
});
}
getData(data);
return res;
};
// 获取树节点的数量
this.getTreeNodeCount = function (data) {
return this.getTreeDataList(data).length || null;
};
// 根据对树节点的子节点根据key值进行排序
this.sortTreeNodeChildrenByKey = function (data, id, key) {
this.getTreeItem(data, id, item => {
if (item) {
item[childrenKey] = objSortBykey(item[childrenKey], key);
}
});
return data;
};
// id获取节点递归函数
this.getTreeItem = function (data, id, callBack) {
data.map(item => {
if (item.id == id) {
callBack && (typeof callBack == 'function') && callBack(item);
} else {
if (item[childrenKey]) {
this.getTreeItem(item[childrenKey], id, callBack);
}
}
});
};
// 根绝树节点id获取树节点的值
this.getTreeNodeById = function (data, id) {
let result = null; // 运行结果
this.getTreeItem(data, id, item => {
result = item;
});
return result;
};
// 设置修改树中的key对象值
this.setTreeNodeValue = function (data, id, key, value) {
this.getTreeItem(data, id, item => {
item[key] = value;
});
};
// 根据id获取对应树中的key值
this.getTreeNodeValueByKey = function (data, id, key) {
let value = null;
this.getTreeItem(data, id, item => {
value = item[key];
});
return value;
};
// 根据id删除对应树中的key值
this.delTreeNodeKey = function (data, id, key) {
let value = null;
this.getTreeItem(data, id, item => {
value = item[key];
if (key in item) {
delete item[key];
}
});
return value;
};
// 往树里面追加子节点
this.appendChildrenNode = function (data, id, node = {}) {
this.getTreeItem(data, id, item => {
if (item) {
if (item[childrenKey]) {
item[childrenKey].push(node);
} else {
item[childrenKey] = [];
item[childrenKey].push(node);
}
}
});
return data;
};
// 根据id 清空子节点
this.clearChildrenNode = function (data, id) {
this.getTreeItem(data, id, item => {
if (item) {
item[childrenKey] = [];
}
});
};
// 通过子节点id删除子节点
this.delChildrenNodeById = function (data, id, childId) {
this.getTreeItem(data, id, item => {
if (item) {
(item[childrenKey] || []).forEach((v, idx) => {
if (v.id == childId) {
item[childrenKey].splice(idx, 1);
}
});
}
});
};
// 获取父级节点
this.getParentNode = function (data, id) {
let currentNode = null;
let parentNode = null;
this.getTreeItem(data, id, item => {
if (item) {
currentNode = item;
}
});
if (currentNode) {
this.getTreeItem(data, currentNode[this.pidKey], item => {
if (item) {
parentNode = item;
}
});
}
return parentNode;
};
// 获取父级及祖先节点
this.getParentNodes = function (data, id) {
let parentNodes = this.getLevelNode(data, id);
return parentNodes;
};
// 获取子节点及子孙所有节点
this.getChildrenNodes = function (data, id) {
let res = [];
let childrens = [];
this.getTreeItem(data, id, item => {
if (item) {
childrens = item[childrenKey];
}
});
function getChs (data) {
for (let i = 0, len = data.length; i res.push(data[i]);
if (data[i][childrenKey] && data[i][childrenKey].length > 0) {
getChs(data[i][childrenKey]);
}
}
}
getChs(childrens);
return res;
};
// 获取子节点及子节点
this.getChildrenNode = function (data, id) {
let childrens = [];
this.getTreeItem(data, id, item => {
if (item) {
childrens = item[childrenKey];
}
});
return childrens;
};
// 辅组查询层级递归遍历函数
this.getTreeLevelNode = function (data, id, topPid = this.topPid, result, pidKey = this.pidKey) {
let currentId = id;
let node = this.getTreeNodeById(data, currentId);
result.push(node);
if (node && node[pidKey] && node[pidKey] !== topPid) {
this.getTreeLevelNode(data, node[pidKey], topPid, result, pidKey);
}
};
// 根据id获取当前树节点的层级节点数据(倒序), topPid 最顶级父节点id
this.getLevelNode = function (data, id, topPid = this.topPid, pidKey = this.pidKey) {
let result = [];
this.getTreeLevelNode(data, id, topPid, result, pidKey);
return result || [];
};
// 获取当前节点层级
this.getNodeLevel = function (data, id) {
const res = this.getLevelNode(data, id);
return res.length || 0;
};

}
w.$TREE = TREEOBJ;
})(window);

 


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了优化算法改进的侏儒猫鼬优化算法(IDMO)及其Matlab源码分享。文章首先介绍了获取代码的两种方式,包括付费下载和付费订阅付费专栏。然后详细解释了侏儒猫鼬优化算法的原理和特点,以及其在集体觅食、侦察和保姆交换等方面的应用。最后提供了CSDN资源下载链接,供读者下载相关代码。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
author-avatar
蟹子萝卜控
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有