有关树形结构数据的功能函数
本文主要介绍的是 有关树形结构数据的处理,下面主要写了几个针对相关功能的功能函数,在此记录一下:
一,在树形数据中,找到某个节点中id为指定值的数据节点(树形结构中所有节点,包括子节点):
function findNodeById(treeData, nodeId) {// 遍历当前层级的所有节点for (var i = 0; i < treeData.length; i++) {var node = treeData[i];// 如果当前节点的 ID 匹配目标节点的 ID,则返回当前节点if (node.id === nodeId) {return node;}// 如果当前节点有子节点,则递归调用当前函数继续查找子节点if (node.children && node.children.length > 0) {var foundNode = findNodeById(node.children, nodeId);// 如果在子节点中找到了目标节点,则返回找到的节点if (foundNode) {return foundNode;}}}// 如果遍历完所有节点仍未找到目标节点,则返回 nullreturn null;
}
二,根据根节点的id将一个一维数组转变为树形数据(rootValue即根节点的id):
function transListToTreeData(list, rootValue) {// 思路:先找到所有的根节点,然后再再去添加children,第二个参数是根节点的pid值var arr = [];list.forEach((item) => {if (item.pid === rootValue) {const children = transListToTreeData(list, item.id);if (children.length) {// 如果children的长度大于0就说明找到了子节点item.children = children;}arr.push(item);}});return arr;
}
三,获取树形根节点的status 值为currentStatus的根节点的节点个数:
function getRootNodeByStatusCount(treeData,currentStatus){let count = 0;if (treeData && treeData.length) { // 判断数据是否存在并且不为空for (let i = 0; i < treeData.length; i++) { // 遍历子节点const node = treeData[i];if (node.status == currentStatus) { // 如果当前节点的 status 为 0,count 加一count++;}if (node.children && node.children.length > 0) { // 如果当前节点存在子节点,则递归遍历子节点count += getRootNodeByStatusCount(node.children,currentStatus);}}}return count;},
四,获取根节点的个数(树形结构中所有节点个数):
function getRootNodeCount(treeData) {if (!Array.isArray(treeData)) {return 0;}let count = 0;for (const node of treeData) {// 如果当前节点没有子节点,则累加计数器if (!node.children) {count++;}if (Array.isArray(node.children)) {// 如果节点有子节点,对其进行递归处理count += this.getRootNodeCount(node.children);}}return count;},
五,根据传入的id数组,给该节点添加一个disabled属性值为false,其他节点添加一个disabled属性值为true(相当于给特定的节点添加树形,其它不需要的节点也添加,可扩展):
function disableTreeNodes(treeData, idArray) {if (!Array.isArray(treeData)) {return;}for (const node of treeData) {if (idArray.includes(node.id)) {// 如果当前节点在 idArray 数组中,则继续递归它的子节点// if (Array.isArray(node.children)) {node.disabled = false;disableTreeNodes(node.children, idArray);// }} else {// 否则将当前节点设为禁用状态,并递归它的子节点node.disabled = true;if (Array.isArray(node.children)) {disableTreeNodes(node.children, idArray);}}}},
六,返回根节点status属性值为status的节点树(根据不通属性的值 返回该节点的所有树形数据):
function filterRootNodes(data,status) {if (!data || data.length === 0) { // 判断数据是否存在并且不为空,如果是,则直接返回空数组return [];}const filteredData = []; // 定义过滤后的数据数组for (let i = 0; i < data.length; i++) { // 遍历每个节点const node = data[i];if (node.status == status) {filteredData.push(node);}if (node.children && node.children.length > 0) { // 如果当前节点存在子节点,则递归遍历子节点const filteredChildren = filterRootNodes(node.children,status); // 对子节点进行递归过滤if (filteredChildren.length > 0) { // 如果过滤后的子节点不为空,则将该节点加入到过滤后的数据数组中,并将过滤后的子节点作为其 children 属性的值filteredData.push({name: node.name,id:node.id,children: filteredChildren,});}}}return filteredData;},
[{label: '一级 1',children: [{label: '二级 1-1',children: [{label: '三级 1-1-1',status:1,}]}]}, {label: '一级 2',children: [{label: '二级 2-1',children: [{label: '三级 2-1-1',status:1,}]}, {label: '二级 2-2',children: [{label: '三级 2-2-1',status:0,}]}]}, {label: '一级 3',children: [{label: '二级 3-1',children: [{label: '三级 3-1-1',status:1,}]}, {label: '二级 3-2',children: [{label: '三级 3-2-1',status:0,}]}]}]
最后 数据奉上不用手敲,对你有用的话点赞收藏吧!