export const useTree = () => { return { filterTreeNodeByField, getAllKeys, getLeafNodeIds, getLeafNode, } } function filterTreeNodeByField({ treeData, params, paramName, icon = '' }) { return treeData.reduce((acc, node) => { if (params.includes(node[paramName]) && !node.children) { acc.push({ ...node, icon }) } if (node.children) { acc = acc.concat( filterTreeNodeByField({ treeData: node.children, params, paramName, icon: node.icon, }) ) } return acc }, []) } function getAllKeys(treeData, key) { const data = 'value' in treeData ? treeData.value : treeData return data.reduce((acc, node) => { // console.log(node, '---') acc.push(node[key]) if (node.children) { acc = acc.concat(getAllKeys(node.children, key)) } return acc }, []) } function getLeafNodeIds(tree, idKey) { let leafIds = [] function traverse(node) { if (!node.children && node.data) { leafIds.push(node[idKey]) } else { for (let child of node.children) { traverse(child) } } } traverse(tree) return leafIds } function getLeafNode(tree) { let leafNodes = [] function traverse(node) { if (!node.children && node.data) { leafNodes.push(node) } else { for (let child of node.children) { traverse(child) } } } traverse(tree) return leafNodes }