/**
?????*?該方法用于將有父子關(guān)系的數(shù)組轉(zhuǎn)換成樹形結(jié)構(gòu)的數(shù)組
?????*?接收一個(gè)具有父子關(guān)系的數(shù)組作為參數(shù)
?????*?返回一個(gè)樹形結(jié)構(gòu)的數(shù)組
????*/
????translateDataToTree(data){
??????//?沒有父節(jié)點(diǎn)的數(shù)據(jù)
??????let?parents?=?data.filter(value?=>?value.upperCompanyCode?==?0);
??????//?有父節(jié)點(diǎn)的數(shù)據(jù)
??????let?children?=?data.filter(value?=>?value.upperCompanyCode?!==?'undefined'?&&?value.upperCompanyCode?!=?null);
??????//?定義轉(zhuǎn)換方法的具體實(shí)現(xiàn)
??????let?translator?=?(parents,children)?=>?{
????????//?遍歷父節(jié)點(diǎn)數(shù)據(jù)
????????parents.forEach((parent)?=>?{
??????????//?遍歷子節(jié)點(diǎn)數(shù)據(jù)
??????????children.forEach((current,index)?=>?{
????????????//?此時(shí)找到父節(jié)點(diǎn)對應(yīng)的一個(gè)子節(jié)點(diǎn)
????????????if(current.upperCompanyCode?===?parent.comCode){
??????????????//?對子節(jié)點(diǎn)數(shù)據(jù)進(jìn)行深拷貝,這里只支持部分類型
??????????????let?temp?=?JSON.parse(JSON.stringify(children));
??????????????//?讓當(dāng)前子節(jié)點(diǎn)從temp中移除,temp作為新的子節(jié)點(diǎn)數(shù)據(jù),這里是為了遞歸時(shí),子節(jié)點(diǎn)的遍歷次數(shù)更少,如果父子關(guān)系的層級越多,越有利
??????????????temp.splice(index,1);
??????????????//?讓當(dāng)前子節(jié)點(diǎn)作為唯一的父節(jié)點(diǎn),去遞歸查找其對應(yīng)的子節(jié)點(diǎn)
??????????????translator([current],?temp);
??????????????typeof?parent.children?!==?'undefined'???parent.children.push(current)?:?parent.children?=?[current]
????????????}
??????????})
????????})
??????};
??????//?調(diào)用轉(zhuǎn)換方法
??????translator(parents,children);
??????//?返回結(jié)果
??????return?parents;
????},