You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

146 lines
4.5 KiB

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