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
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,
|
|
}
|
|
|