將有層級標誌的陣列轉為樹狀結構

2021-08-27 22:05:53 字數 1417 閱讀 4813

最近專案中遇到了將陣列形式的選單轉化為樹狀結構的選單

例如,原始資料是

[,,

,,,,

,,,]

轉化為

需求已經明確,現在就看是怎麼實現的

兩次對陣列兩次迴圈

第一次迴圈

找到所有第一級選單放入陣列a,其餘的放入另乙個陣列b,並將所有選單以id作為key放入乙個物件c中,

第二次迴圈

對陣列b迴圈,通過parentid到物件c中找到父級,並push到父級的children陣列中。

通過這兩次迴圈,已經轉化完成,**如下

function array2tree (arr) ;

arr.foreach(function (item) else

item.children = ;

arrobj[item.id] = item;

});sub.foreach(function (item) ;

parent.children.push(item);

});return top;

}

那麼問題來了,能否通過一次迴圈就解決問題,答案是可以的

在迴圈過過程中將第一級選單放入陣列a,將所有選單以id作為key放入物件b中,同時以parentid作為key在物件b中找到其父級,並將其push到父級的children中,在這一步需要注意的是,如果子級先出現,那麼就有可能在物件b中找不到父級。所以這裡要作點處理,具體如下

如果子級先出現,在物件b中找不到父級,這是要在物件b中建立乙個物件作為臨時的父級,並將子級push到這個臨時的父級children中。當然這個子選單也要放入物件b中

這是又會出現另外乙個問題,當真正的父級出現時,物件b中已經存在乙個臨時的父級時,這時要作的處理是將臨時的父級的屬性擴充套件到真正的父級中,並用真正的父級替換物件b中的臨時父級。

哈哈,真繞,看**

function array2tree (arr) ;

arr.foreach(function (item)

item.children = ;

own = arrobj[id];

if (own) );

}arrobj[id] = item;

parent = arrobj[parentid];

if (!parent) ;

arrobj[parentid] = parent;

}parent.children.push(item);

});return top;

}

資料結構 將有序陣列轉為二叉搜尋樹

將有序陣列轉化為二叉搜尋樹 二叉搜尋樹 每乙個節點的值大於左孩子的值,小於右孩子的值,如果採用中序遍歷,輸出結果為從小到大的 public binarytree arraytobst t array,int start,int end 將陣列的中間值賦給節點,遞迴呼叫完成左子樹和右子樹的建立 int...

將XML轉為陣列結構的函式

此方法要求傳入乙個節點 domnode 返回該節點下的所以子節點組成的陣列。比如乙個xml檔案 file1.txt 2009 09 07 2009 09 08 file2.txt 2009 09 01 2009 09 04 file3.txt 2009 09 01 2009 09 02 2009 0...

把有層級的一維陣列改為樹形結構

朋友問的問題,我試著寫了一下。用了兩層遞迴,感覺很麻煩。doctype html html lang en head meta charset utf 8 title document title head body body html script type text j ascript let ...