扁平數據
轉為最終效果
[ { "label" : "疼遜有限公司" , "code" : "1212" , "disabled" : false , "parentId" : "none" , "children" : [ { "label" : "財務部" , "code" : "34343" , "disabled" : false , "parentId" : "1212" } , { "label" : "人事部" , "code" : "43434" , "disabled" : false , "parentId" : "1212" } , { "label" : "經營 部" , "code" : "53543" , "disabled" : false , "parentId" : "1212" , "children" : [ { "label" : "市場部" , "code" : "23232" , "disabled" : true , "parentId" : "53543" } , { "label" : "銷售部" , "code" : "3435435" , "disabled" : false , "parentId" : "53543" } ] } ] } ]
碼
const removeNoneDataChildren = ( node, childKey = 'children' ) => { const remove = nodeItem => { if ( nodeItem[ childKey] && nodeItem[ childKey] . length === 0 ) { delete nodeItem[ childKey] ; } else if ( nodeItem[ childKey] ) { nodeItem[ childKey] . forEach ( remove) ; } } node. forEach ( remove) ; return node
}
const buildTree = ( flatList, idKey = 'id' , parentKey = 'parentId' , childKey = 'children' , delNoneDataChildren = true ) => { const map = { } ; const roots = [ ] ; flatList. forEach ( item => { map[ item[ idKey] ] = { ... item, [ childKey] : [ ] } ; } ) ; flatList. forEach ( item => { const itemId = item[ idKey] ; const parentId = item[ parentKey] ; if ( parentId !== null && map[ parentId] ) { map[ parentId] [ childKey] . push ( map[ itemId] ) ; } else { roots. push ( map[ itemId] ) ; } } ) ; if ( delNoneDataChildren) return removeNoneDataChildren ( roots, childKey) ; return roots;
}
const test = [ { label: '疼遜有限公司' , code: '1212' , disabled: false , parentId: 'none' } , { label: '財務部' , code: '34343' , disabled: false , parentId: '1212' } , { label: '人事部' , code: '43434' , disabled: false , parentId: '1212' } , { label: '經營部' , code: '53543' , disabled: false , parentId: '1212' } , { label: '市場部' , code: '23232' , disabled: true , parentId: '53543' } , { label: '銷售部' , code: '3435435' , disabled: false , parentId: '53543' } ] ;
const tree = buildTree ( test, 'code' , 'parentId' , 'children' ) ;
console. log ( "1 ~ tree:" , JSON . stringify ( tree) )