|
|
//树对象相关操作 目前只支持单主键操作
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,}
|