//树对象相关操作 目前只支持单主键操作 const { deepCopy } = require("./proFunc"); //将list数据,生成tree // dataSource:列表数据资源 // childNodeName:子节点名称 // pidName:父ID列名 // idName:id列名 // pidVal:父id初始值 function madeTree(dataSource, childNodeName, pidName, idName, pidVal) { if (!dataSource || dataSource.length < 1) return []; let trees = [] let lchildNodeName = childNodeName || 'children'; let lpidName = pidName || 'pid'; let lidName = idName || 'id'; dataSource.forEach(e => { let tree = {}, ret = null; if (pidVal) { //根节点有具体的值 if (e[lpidName] == pidVal) { tree = e; ret = madeTree(dataSource, lchildNodeName, lpidName, lidName, e[lidName]); if (ret && ret.length > 0) tree[lchildNodeName] = ret; trees.push(tree); } } else { if (!e[lpidName]) { //根节点为0,空或null tree = e; ret = madeTree(dataSource, lchildNodeName, lpidName, lidName, e[lidName]); if (ret && ret.length > 0) tree[lchildNodeName] = ret; trees.push(tree); } } }) return trees; } //通过ID值,找出所有父节点值 function getTreePids(tree, childNodeName, pidName, idName, idVal) { let pids = [], treeNode = null; if (!tree || tree.length < 1) return []; if (!idVal) return []; let lchildNodeName = childNodeName || 'children'; let lpidName = pidName || 'pid'; let lidName = idName || 'id'; treeNode = getTreeNode(tree, lchildNodeName, lidName, idVal); //console.log('treeNode',treeNode); if (treeNode) { pids.unshift(treeNode[lpidName]); pids = [].concat(getTreePids(tree, lchildNodeName, lpidName, lidName, treeNode[lpidName]),pids) // getTreePids(tree, lchildNodeName, lpidName, lidName, treeNode[lpidName]).forEach(e => { // pids.unshift(e); // }); } return pids; } //通过node值,找出所有子节点值 function getTreeAllChildIdsByNode(treeNode, childNodeName, idName) { let childIds = []; let lchildNodeName = childNodeName || 'children'; let lidName = idName || 'id'; if (!treeNode) return []; if (!treeNode[lchildNodeName] || treeNode[lchildNodeName].length < 1) return []; treeNode[lchildNodeName].forEach(e => { childIds.push(e[lidName]); getTreeAllChildIdsByNode(e, lchildNodeName, lidName).forEach(e2 => { childIds.push(e2); }); }); return childIds; } //通过ID值,找出所有子节点值 function getTreeAllChildIdsById(tree, childNodeName, idName, idVal) { let childIds = [], treeNode = null; let lchildNodeName = childNodeName || 'children'; let lidName = idName || 'id'; if (!tree || tree.length < 1) return []; treeNode = getTreeNode(tree, lchildNodeName, lidName, idVal); childIds = getTreeAllChildIdsByNode(treeNode, lchildNodeName, lidName); return childIds; } //获取节点本身 function getTreeNode(tree, childNodeName, idName, idVal) { let treeNode = null; let lchildNodeName = childNodeName || 'children'; let lidName = idName || 'id'; if (!tree || tree.length < 1) return treeNode; for (let i = 0; i < tree.length; i++) { if (tree[i][lidName] == idVal) { treeNode = tree[i]; break; } else { if (tree[i][lchildNodeName] && tree[i][lchildNodeName].length > 0) { treeNode = getTreeNode(tree[i][lchildNodeName], lchildNodeName, lidName, idVal); } if (treeNode) break; } } return treeNode; } // 根节点找到,则包含子级点, 子节点找到,则只包含上级节点 function filterTreeNode(treeData, childNodeName, keys, vals) { let newTree = [] let find = false if (Array.isArray(treeData) && treeData.length > 0) { treeData.forEach(e => { find = false keys.forEach((key, i) => { if (e[key].indexOf(vals[i]) > -1) find = true }); // 当前级找到 if (find) { newTree.push(e) } else { let childTree = filterTreeNode(e[childNodeName], childNodeName, keys, vals) if (childTree.length > 0) { let temp = deepCopy(e) temp[childNodeName] = childTree newTree.push(temp) } } }); } return newTree } module.exports = { madeTree, getTreePids, getTreeAllChildIdsByNode, getTreeAllChildIdsById, getTreeNode,filterTreeNode, }