|
|
|
@ -1,5 +1,7 @@ |
|
|
|
//树对象相关操作 目前只支持单主键操作
|
|
|
|
|
|
|
|
const { deepCopy } = require("./proFunc"); |
|
|
|
|
|
|
|
//将list数据,生成tree
|
|
|
|
// dataSource:列表数据资源
|
|
|
|
// childNodeName:子节点名称
|
|
|
|
@ -7,112 +9,137 @@ |
|
|
|
// 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.push(treeNode[lpidName]); |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
module.exports = { |
|
|
|
madeTree, |
|
|
|
getTreePids, getTreeAllChildIdsByNode,getTreeAllChildIdsById, getTreeNode, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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.push(treeNode[lpidName]); |
|
|
|
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, |
|
|
|
} |
|
|
|
|