const treeData = [ { title : '1' , id : '1' , key : '1' , children : [ { title : '1-1' , id : '2' , key : '2' , children : [ { title : '1-1-1' , id : '3' , key : '3' , } , ] , } , ] , } , { title : '2' , id : '2' , key : '1' , children : [ { title : '2-1' , id : '4' , key : '4' , children : [ { title : '2-1-1' , id : '5' , key : '5' , } , ] , } , ] , } , ] ;
export function findSons ( tree, nodeId ) { for ( let item of tree) { if ( item. id === nodeId) { return item. children || [ ] ; } else if ( item. children && item. children. length > 0 ) { let r = findSons ( item. children, nodeId) ; if ( r. length > 0 ) { return r; } } } return [ ] ;
}
根据某一节点id 递归查找父节点 与其自身 返回 ids 数组
export function findParents ( tree, id ) { for ( let i in tree) { if ( tree[ i] . id == id) return [ tree[ i] . id] ; if ( tree[ i] . children) { let node = findParents ( tree[ i] . children, id) ; if ( node !== undefined ) return node. concat ( tree[ i] . id) ; } }
}
export function rightTreeDataFilter ( allTreeData, keys = [ ] , res = [ ] ) { for ( let item of allTreeData) { if ( keys. includes ( item. key) ) { let one = { ... item } ; one. children = [ ] ; if ( item. children && item. children. length > 0 ) { rightTreeDataFilter ( item. children, keys, one. children) ; } res. push ( one) ; } }
}
export function countLength ( allTreeData, count ) { for ( let item of allTreeData) { count. number++ ; count. ids. push ( item. id) ; if ( item. children && item. children. length > 0 ) { countLength ( item. children, count) ; } }
}
export function filterTree ( treeData, searchString ) { let result = [ ] ; function traverse ( node ) { if ( node. title. includes ( searchString) ) { result. push ( node) ; } else { if ( node. children && node. children. length > 0 ) { node. children. forEach ( ( child ) => { traverse ( child) ; } ) ; } } } for ( let item of treeData) { traverse ( item) ; } return result;
}
export function filterTreeAndFather ( treeData, searchString ) { function checkNodeAndSubtree ( node ) { if ( node. title. includes ( searchString) ) { return true ; } else if ( node. children) { let hasMatchingChild = false ; node. children = node. children. filter ( ( child ) => { const result = checkNodeAndSubtree ( child) ; if ( result) hasMatchingChild = true ; return result; } ) ; return hasMatchingChild; } return false ; } return treeData. filter ( ( rootNode ) => checkNodeAndSubtree ( rootNode) ) ;
}